perm filename HAL.CRF[HAL,HE]1 blob
sn#120134 filedate 1974-09-13 generic text, type T, neo UTF8
≠COMMEN≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 1
HAL PAL[HAL,HE] PAGE 1
≥ COMMENT ⊗ VALID 00002 PAGES
≥ C REC PAGE DESCRIPTION
≥ C00001 00001
≥ C00002 00002 .TITLE HAL Runtime System
≥ C00003 ENDMK
≥ C⊗;
≠.TITLE≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 2
HAL PAL[HAL,HE] PAGE 2
≥ .TITLE HAL Runtime System
≥
≠.INSRT≡≥ .INSRT HALHED.PAL[HAL,HE]
≠COMMEN≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 3
HALHED PAL[HAL,HE] PAGE 1
≥ COMMENT ⊗ VALID 00004 PAGES
≥ C REC PAGE DESCRIPTION
≥ C00001 00001
≥ C00002 00002 .SBTTL DEFS -- standard definitions for HAL runtime routines
≥ C00005 00003 routine calling and defining macros.
≥ C00007 00004 Graph structure definitions
≥ C00008 ENDMK
≥ C⊗;
≠.SBTTL≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 4
HALHED PAL[HAL,HE] PAGE 2 DEFS -- standard definitions for HAL runtime routines
≥ .SBTTL DEFS -- standard definitions for HAL runtime routines
≥
≥ ; PROGRAM DEFINITIONS
≥
≡ERRTRP≠≥ 000004 ERRTRP=4 ;time out and error trap
≡ILGINS≠≥ 000010 ILGINS=10 ;illegal instruction
≡CLKTRP≠≥ 000104 CLKTRP=104 ;clock trap
≡RUG≠≥ 050000 RUG=50000 ;Restart of RUG
≡PS≠≥ 177776 PS=177776 ;processor status word
≡KBIS≠≥ 177560 KBIS=177560 ;keyboard input status
≡KBIR≠≥ 177562 KBIR=177562 ;keyboard input register
≡KBOS≠≥ 177564 KBOS=177564 ;keyboard output status
≡KBOR≠≥ 177566 KBOR=177566 ;keyboard output register
≡CLKCNT≠≥ 172544 CLKCNT=172544 ;clock counter
≡CLKSET≠≥ 172542 CLKSET=172542 ;clock set register
≡CLKS≠≥ 172540 CLKS=172540 ;clock status
≥
≡STRT11≠≥ 000500 STRT11=500 ;starting address of program
≡IBUF≠≥ 000150 IBUF=150 ;start of input buffer from 11
≡OBUF≠≥ 000160 OBUF=160 ;start of output buffer to 11
≡HCOR≠≥ 077776 HCOR=77776 ;highest useable word in core
≥
≥
≥ ;REGISTER DEFINITIONS
≥
≡%5≡≡AC5≠≥ 000005 AC5=%5 ;Floating point register
≡%4≡≡AC4≠≥ 000004 AC4=%4 ; " " "
≡%3≡≡AC3≠≥ 000003 AC3=%3 ; " " "
≡%2≡≡AC2≠≥ 000002 AC2=%2 ; " " "
≡%1≡≡AC1≠≥ 000001 AC1=%1 ;Temp. F.P. register
≡%0≡≡AC0≠≥ 000000 AC0=%0 ; " " "
≡%7≡≡PC≠≥ 000007 PC=%7 ;program counter
≡%6≡≡SP≠≥ 000006 SP=%6 ;stack pointer
≡%5≡≡RF≠≥ 000005 RF=%5 ;Display pointer
≡%4≡≡R4≠≥ 000004 R4=%4 ;Saved across procedure calls
≡%3≡≡R3≠≥ 000003 R3=%3 ;Saved across procedure calls
≡%2≡≡R2≠≥ 000002 R2=%2 ;Saved across procedure calls
≡%1≡≡R1≠≥ 000001 R1=%1 ;temp
≡%0≡≡R0≠≥ 000000 R0=%0 ;temp
≥
≥ ;MARK DEFINITIONS
≡MARK0≠≥ 006400 MARK0 = 6400 ;MARK 0
≡MARK1≠≥ 006401 MARK1 = 6401 ;MARK 1
≡MARK2≠≥ 006402 MARK2 = 6402 ;ETC.
≡MARK3≠≥ 006403 MARK3 = 6403
≡MARK4≠≥ 006404 MARK4 = 6404
≡MARK5≠≥ 006405 MARK5 = 6405
≥
≥ ;Arithmetic definitions
≡PLACES≠ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 5
HALHED PAL[HAL,HE] PAGE 2.1 DEFS -- standard definitions for HAL runtime routines
≥ 000000 PLACES = 0 ;Number of bits to the right of the radix point in fixed.
HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 6
HALHED PAL[HAL,HE] PAGE 3 DEFS -- standard definitions for HAL runtime routines
≥ ;routine calling and defining macros.
≥ ;Coded by RHT 9/74.
≥
≥ ;This should be used at the start of routines which reference
≥ ; parameters off the RF stack. It gives the parameters
≥ ; symbolic names for clarity of coding.
≥ ;For example,
≥ ;
≥ ; ROUTINE FOO,<A,B>
≥ ;
≥ ;Goes to
≥ ;
≥ ; A==4
≥ ; B==2
≥ ;FOO:
≥
≠.MACRO≡≤ROUTIN≠≥ .MACRO ROUTINE ID,ARGS
≥ .IFNB ARGS
≥ NNNN==0
≥ .IRP II,<ARGS> ;Raise NNNN to twice the number of args.
≥ NNNN==NNNN+2
≥ .ENDM
≥ .IRP II,<ARGS> ;Assign each arg NNNN and decrease same.
≥ II == NNNN
≥ NNNN == NNNN-2
≥ .ENDM
≥ .ENDC
≥ ID:
≥ .ENDM
≥
≥ ;This is useful in calling rountines which reference parameters off
≥ ; the RF stack. It sets up the stack properly, but does not
≥ ; save R0 or R1.
≥
≠.MACRO≡≤CALL≠≥ .MACRO CALL ID,ARGS
≥ MOV RF,-(SP) ;Save RF
≥ NNNN == 6400 ;This is a MARK 0 instruction
≥ .IFNB ARGS
≥ .IRP II,<ARGS>
≥ MOV II,-(SP);Push an argument
≥ NNNN == NNNN+1 ;Make NNNN the next MARK instruction.
≥ .ENDM
≥ .ENDC
≥ MOV #NNNN,-(SP) ;Push the mark instruction.
≥ MOV SP,RF ;Set up the display in RF.
≥ JSR PC,ID ;Call the routine
≥ .ENDM
HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 7
HALHED PAL[HAL,HE] PAGE 4 DEFS -- standard definitions for HAL runtime routines
≥ ;Graph structure definitions
≥ ;RHT 9/74
≥
≠.MACRO≡≤XX≠≥ .MACRO XX SYM ;Just gives SYM the next number.
≥ SYM == II
≥ II == II+2
≥ .ENDM
≥
≥ ;CELL LINKS
≡II≠≥ 000000 II==0
≤XX≡≥ XX DATUM
≡II≡≡DATUM≠≡II≡≡II≠≤XX≡≥ XX LINKF
≡II≡≡LINKF≠≡II≡≡II≠≤XX≡≥ XX LINKB
≡II≡≡LINKB≠≡II≡≡II≠≥
≥ ;GRAPH NODES
≡II≠≥ 000000 II==0
≤XX≡≥ XX NXTGN ;CHAIN OF ALL GNODES IN THE WORLD
≡II≡≡NXTGN≠≡II≡≡II≠≤XX≡≥ XX PRVGN
≡II≡≡PRVGN≠≡II≡≡II≠≤XX≡≥ XX INVMRK ;USED AS FLAG
≡II≡≡INVMRK≠≡II≡≡II≠≤XX≡≥ XX GNVAL ;POINTER AT VALUE
≡II≡≡GNVAL≠≡II≡≡II≠≤XX≡≥ XX GNDEPS ;DEPENDENT GRAPH NODES
≡II≡≡GNDEPS≠≡II≡≡II≠≤XX≡≥ XX GNCLCS ;CALCULATOR LIST (DBL LINKED)
≡II≡≡GNCLCS≠≡II≡≡II≠≤XX≡≥ XX GNCHGS ;CHANGE LIST
≡II≡≡GNCHGS≠≡II≡≡II≠≥
≥ ;CALCULATOR CELL
≡II≠≥ 000000 II==0
≤XX≡≥ XX NXTCLC ;LIST LINK
≡II≡≡NXTCLC≠≡II≡≡II≠≤XX≡≥ XX NEEDED ;LIST OF NEEDED NODES
≡II≡≡NEEDED≠≡II≡≡II≠≤XX≡≥ XX FORM ;SOME SORT OF CODE TO EVAL
≡II≡≡FORM≠≡II≡≡II≠≥
≥ ;CHANGER CELL
≡II≠≥ 000000 II==0
≤XX≡≥ XX NXTCHG
≡II≡≡NXTCHG≠≡II≡≡II≠≤XX≡≥ XX CHGCOD
≡II≡≡CHGCOD≠≡II≡≡II≠≥
≡STRT11≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 8
HAL PAL[HAL,HE] PAGE 2.1 DEFS -- standard definitions for HAL runtime routines
≥ 000500 .=STRT11
≠.INSRT≡≥ .INSRT HALIO.PAL[HAL,HE]
≠COMMEN≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 9
HALIO PAL[HAL,HE] PAGE 1 DEFS -- standard definitions for HAL runtime routines
≥ COMMENT ⊗ VALID 00003 PAGES
≥ C REC PAGE DESCRIPTION
≥ C00001 00001
≥ C00002 00002 .SBTTL TTY output routines
≥ C00005 00003 .SBTTL Useful macros for use of I/O routines
≥ C00007 ENDMK
≥ C⊗;
≠.SBTTL≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 10
HALIO PAL[HAL,HE] PAGE 2 TTY output routines
≥ .SBTTL TTY output routines
≥ ; Modified 5-Sep-74 by RF. Originally written by KKP.
≥
≥ ; Output a string, ending with a zero character. Pointer to start
≥ ; of string in R0. Called in "simple" style.
≥
≠.EVEN≡≥ 000500 .EVEN
≡TYPSTR≠≠MOV≡≡R0≡≡R1≡≥ 000500 010001 TYPSTR: MOV R0,R1 ;R1 ← LOC[STRING]
≠MOVB≡≡R1≡≡R0≡≥ 000502 112100 MOVB (R1)+,R0 ;R0 ← first byte of string
≡TSLOOP≠≠JSR≡≡PC≡≡TYPCHR≡≥ 000504 004767 000056 TSLOOP: JSR PC,TYPCHR ;Type this one character
≠MOVB≡≡R1≡≡R0≡≥ 000510 112100 MOVB (R1)+,R0 ;R0 ← Next byte of string
≠BNE≡≡TSLOOP≡≥ 000512 001374 BNE TSLOOP ;If more to come, repeat.
≠RTS≡≡PC≡≥ 000514 000207 RTS PC ;Done
≥
≥
≥ ; Routines to output numbers. Argument in R0.
≥ ; TYPDEC outputs in base 10, and TYPOCT in base 8.
≥ ; Both use TYPDIG as a subroutine, putting the digit
≥ ; in R0.
≥ ; TYPCHR is a general purpose character output routine.
≥
≠.EVEN≡≥ 000516 .EVEN
≡TYPDEC≠≠MOV≡≡RADIX≡≥ 000516 012767 000012 000020 TYPDEC: MOV #12,RADIX ;To output in base 10
≠BR≡≡TYPDIG≡≥ 000524 000404 BR TYPDIG ;Go type it.
≡TYPOCT≠≠MOV≡≡RADIX≡≥ 000526 012767 000010 000010 TYPOCT: MOV #8,RADIX ;To output in base 8.
≠BR≡≡TYPDIG≡≥ 000534 000400 BR TYPDIG ;Go type it.
≡TYPDIG≠≠MOV≡≡R0≡≡R1≡≥ 000536 010001 TYPDIG: MOV R0,R1 ;Need dividend in R1, with R0 clear.
≠CLR≡≡R0≡≥ 000540 005000 CLR R0 ;Clear upper half of dividend.
≠DIV≡≡PC≡≡R0≡≥ 000542 071027 DIV (PC)+,R0 ;Divide argument in R0, R1 by radix.
≡RADIX≠≥ 000544 000012 RADIX: 12 ;Starts out in decimal.
≠BEQ≡≡TYPOUT≡≥ 000546 001404 BEQ TYPOUT ;If quotient zero, then can print.
≠MOV≡≡R1≡≡SP≡≥ 000550 010146 MOV R1,-(SP) ;Else stack quotient
≠JSR≡≡PC≡≡TYPDIG≡≥ 000552 004767 177760 JSR PC,TYPDIG ;Recursive call.
≠MOV≡≡SP≡≡R1≡≥ 000556 012601 MOV (SP)+,R1 ;Unstack last quotient
≡TYPOUT≠≠ADD≡≡R1≡≥ 000560 062701 000060 TYPOUT: ADD #'0,R1 ;Form TTY code for digit
≠MOV≡≡R1≡≡R0≡≥ 000564 010100 MOV R1,R0 ;Need argument for TYPCHR in R0.
≡TYPCHR≠≠TSTB≡≡KBOS≡≥ 000566 105767 176772 TYPCHR: TSTB KBOS ;Is TTY available?
≠BPL≡≡TYPCHR≡≥ 000572 100375 BPL TYPCHR ;No. Busy wait for it.
≠MOVB≡≡R0≡≡KBOR≡≥ 000574 110067 176766 MOVB R0,KBOR ;Yes. Output a byte to it.
≠CMP≡≡R0≡≥ 000600 022700 000012 CMP #12,R0 ;Was it a line feed?
≠BNE≡≡TYPRET≡≥ 000604 001007 BNE TYPRET ;If not that code, then done.
≠CLR≡≡R0≡≥ 000606 005000 CLR R0 ;Otherwise, output 3 nulls.
≠JSR≡≡PC≡≡TYPCHR≡≥ 000610 004767 177752 JSR PC,TYPCHR ;
≠JSR≡≡PC≡≡TYPCHR≡≥ 000614 004767 177746 JSR PC,TYPCHR ;
≠JSR≡≡PC≡≡TYPCHR≡≥ 000620 004767 177742 JSR PC,TYPCHR ;
≡TYPRET≠≠RTS≡≡PC≡≥ 000624 000207 TYPRET: RTS PC ;Return.
≥
≥
≠.SBTTL≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 11
HALIO PAL[HAL,HE] PAGE 3 Useful macros for use of I/O routines
≥ .SBTTL Useful macros for use of I/O routines
≥
≠.MACRO≡≤OUTSTR≠≥ .MACRO OUTSTR B ;Type string starting at B.
≥ MOV R0,-(SP) ;Save R0. Who knows what was happening in it?
≥ MOV R1,-(SP) ;Save R1.
≥ MOV #B,R0 ;Load up the string to be output
≥ JSR PC,TYPSTR ;Call the string output utility routine.
≥ MOV (SP)+,R1 ;Restore R1.
≥ MOV (SP)+,R2 ;Restore R2.
≥ .ENDM
≥
≠.MACRO≡≤ASCIE≠≥ .MACRO ASCIE STR
≥ .ASCIZ STR
≥ .EVEN
≥ .ENDM
≥
≠.MACRO≡≤CRLF≠≥ .MACRO CRLF
≥ OUTSTR CRLFX ;Carriage return, line feed.
≥ .ENDM
≥
≡CRLFX≠≠.ASCIZ≡≥ 000626 015
≥ 000627 012 CRLFX: .ASCIZ /
≥ 000630 000
≥ /
≥
≡RUGMES≠≤ASCIE≡≥ RUGMES: ASCIE </π
≥ --YOU'RE UNDER THE RUG
≥ π/>
≠.ASCIZ≡≠.EVEN≡≥
≠.MACRO≡≤HALERR≠≥ .MACRO HALERR MES ;Bad error. Type message, call RUG.
≥ MOV R0,-(SP) ;Save R0.
≥ MOV R1,-(SP) ;Save R1.
≥ MOV #CRLFX,R0 ;Move to new line
≥ JSR PC,TYPSTR ;
≥ MOV #MES,R0 ;Type out message
≥ JSR PC,TYPSTR ;
≥ MOV #RUGMES,R0 ;Type out RUGMES
≥ JSR PC,TYPSTR ;
≥ MOV (SP)+,R1 ;Restore R1.
≥ MOV (SP)+,R0 ;Restore R2.
≥ JMP RUG ;Go directly to RUG.
≥ BR .-4 ;In case we return.
≥ .ENDM
≥
≠.MACRO≡≤TTYIN≠≥ .MACRO TTYIN B ;To read in a word.
≥ TSTB KBIS ;Is keyboard ready?
≥ BEQ .-4 ;No. Busy wait.
≥ MOV KBIR,B ;Yes. Read a word.
≥ BIC #200,B ;Mask off a bit.
HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 12
HALIO PAL[HAL,HE] PAGE 3.1 Useful macros for use of I/O routines
≥ .ENDM
≥
≠.INSRT≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 13
HALRTR PAL[HAL,HE] PAGE 2.2 Useful macros for use of I/O routines
≥ .INSRT HALRTR.PAL[HAL,HE]
≠COMMEN≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 14
HALRTR PAL[HAL,HE] PAGE 1 Useful macros for use of I/O routines
≥ COMMENT ⊗ VALID 00002 PAGES
≥ C REC PAGE DESCRIPTION
≥ C00001 00001
≥ C00002 00002 .SBTTL Free storage management
≥ C00009 ENDMK
≥ C⊗;
≠.SBTTL≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 15
HALRTR PAL[HAL,HE] PAGE 2 Free storage management
≥ .SBTTL Free storage management
≥
≥ ; Assembly variables
≡FREL≠≥ 004000 FREL = 4000 ;Test of small amount. Maximum = 40000 (IN WORDS!)
≥
≥ ; Free storage block
≠.EVEN≡≥ 000666 .EVEN
≡FREEPT≠≡FREEST≡≡FREEST≡≥ 000666 000672 FREEPT: FREEST
≥ 000670 177777 -1 ;Left bdry tag is negative.
≡FREEST≠≡FREL≡≡FREL≡≥ 000672 010000 FREEST: FREL*2 ;Beginning of free storage. Boundary tag.
≠.BLKW≡≡FREL≡≥ 010670 .BLKW FREL-2 ;
≡FREEND≠≡FREL≡≡FREL≡≥ 010670 010000 FREEND: FREL*2 ;End of free storage. Boundary tag.
≥ 010672 177777 -1 ;Right bdry tag is negative.
≥
≥ ; Routine to initialize storage. Need only call if you think
≥ ; storage has been munged, or you want to start over for
≥ ; some reason.
≡FRINIT≠≠MOV≡≡FREL≡≡FREEST≡≥ 010674 012767 010000 167770 FRINIT: MOV #FREL*2,FREEST ;Lower inner tag
≠MOV≡≡FREL≡≡FREEND≡≥ 010702 012767 010000 177760 MOV #FREL*2,FREEND ;Upper inner tag
≠MOV≡≡FREEST≡≡FREEPT≡≥ 010710 012767 000672 167750 MOV #FREEST,FREEPT ;Roving free pointer
≠CMP≡≡FREEST≡≡FREEND≡≥ 010716 026767 167746 177746 CMP FREEST-2,FREEND+2 ;Do the two outer tags agree?
≠BNE≡≡FRINER≡≥ 010724 001001 BNE FRINER ;No.
≠RTS≡≡PC≡≥ 010726 000207 RTS PC ;Yes. Return.
≡FRINER≠≤HALERR≡≥ FRINER: HALERR FRINMS
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡FRINMS≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≡FRINMS≠≤ASCIE≡≥ FRINMS: ASCIE /FRINIT FEARS FREE STORAGE HAS BEEN MUNGED/
≠.ASCIZ≡≠.EVEN≡≥
≥ ; Routine to assign storage. Amount of words requested in R0.
≥ ; Location of first word in block (not the boundary tag) returned
≥ ; in R0.
≥ ; The boundary tag method described in Knuth I.2.5 is
≥ ; used. Each block of storage has a boundary tag at
≥ ; each end, with identical contents: The number
≥ ; of bytes in the whole area if available, and the opposite
≥ ; of that if busy. Artificial busy areas above and below
≥ ; free storage.
≡GTFREE≠≠MOV≡≡R2≡≡SP≡≥ 011050 010246 GTFREE: MOV R2,-(SP) ;Save R2 on stack.
≠ASL≡≡R0≡≥ 011052 006300 ASL R0 ;Convert words to bytes
≠BLT≡≡FREERR≡≥ 011054 002454 BLT FREERR ;Asked for negative number of words.
≠ADD≡≡R0≡≥ 011056 062700 000004 ADD #4, R0 ;Need 2 extra words for boundary tags
≠MOV≡≡FREEPT≡≡R1≡≥ 011062 016701 167600 MOV FREEPT, R1 ;R1 ← running LOC[LTAG[*]]
≡FRTRY≠≠CMP≡≡R1≡≡FREEND≡≥ 011066 020127 010670 FRTRY: CMP R1,#FREEND ;Are we off the end of free storage?
≠BLOS≡≡FR2≡≥ 011072 101402 BLOS FR2 ;No.
≠MOV≡≡FREEST≡≡R1≡≥ 011074 012701 000672 MOV #FREEST,R1 ;Yes. Reset pointer to beginning.
≡FR2≠≠CMP≡≡R1≡≡R0≡≥ 011100 021100 FR2: CMP (R1),R0 ;Do we have enough room here?
≠BGE≡≡FFOUND≡≥ 011102 002011 BGE FFOUND ;Yes
≠TST≡≡R1≡≥ 011104 005711 TST (R1) ;No. Is this area busy? If so, its count is negative.
≠BGE≡≡FRPOS≡≥ 011106 002002 BGE FRPOS ;No.
≠SUB≡≡R1≡≡R1≡≥ 011110 161101 SUB (R1),R1 ;Yes. R1 ← LOC[LTAG[next] by subtraction.
≠BR≡≡FR1≡≥ 011112 000401 BR FR1
≡FRPOS≠≠ADD≡≡R1≡≡R1≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 16
HALRTR PAL[HAL,HE] PAGE 2.1 Free storage management
≥ 011114 061101 FRPOS: ADD (R1),R1 ;R1 ← LOC[LTAG[next] by addition.
≡FR1≠≠CMP≡≡R1≡≡FREEPT≡≥ 011116 020167 167544 FR1: CMP R1,FREEPT ;Have we cycled all through free storage
≠BEQ≡≡FROVFL≡≥ 011122 001454 BEQ FROVFL ;Yes. No room!
≠BR≡≡FRTRY≡≥ 011124 000760 BR FRTRY ;No. Try again.
≡FFOUND≠≠BEQ≡≡FEXACT≡≥ 011126 001422 FFOUND: BEQ FEXACT ;If 0, then exact fit.
≠MOV≡≡R1≡≡R2≡≥ 011130 010102 MOV R1,R2 ;Divide the found block into FOUND and HOLE.
≥ ;Thus, R1 = LOC[LTAG[FOUND]].
≠ADD≡≡R0≡≡R2≡≥ 011132 060002 ADD R0,R2 ;R2 ← LOC[LTAG[HOLE]]
≠NEG≡≡R0≡≥ 011134 005400 NEG R0 ;R0 ← negative (busy) count of FOUND.
≠MOV≡≡R0≡≡R2≡≥ 011136 010062 177776 MOV R0,-2(R2) ;RTAG[FOUND] ← new FOUND count.
≠MOV≡≡R0≡≡SP≡≥ 011142 010046 MOV R0,-(SP) ;Save R0.
≠ADD≡≡R1≡≡R0≡≥ 011144 061100 ADD (R1),R0 ;R0 ← new HOLE count.
≠MOV≡≡R0≡≡R2≡≥ 011146 010012 MOV R0,(R2) ;LTAG[HOLE] ← new HOLE count.
≠MOV≡≡R2≡≡FREEPT≡≥ 011150 010267 167512 MOV R2,FREEPT ;Free pointer ← LOC[LTAG[HOLE]]
≠MOV≡≡R1≡≡R2≡≥ 011154 010102 MOV R1,R2 ;
≠TST≡≡R2≡≥ 011156 005742 TST -(R2) ;
≠ADD≡≡R1≡≡R2≡≥ 011160 061102 ADD (R1),R2 ;R2 ← LOC[RTAG[HOLE]].
≠MOV≡≡R0≡≡R2≡≥ 011162 010012 MOV R0,(R2) ;RTAG[HOLE] ← new HOLE count.
≠MOV≡≡SP≡≡R1≡≥ 011164 012621 MOV (SP)+,(R1)+ ;LTAG[FOUND] ← new FOUND count.
≡FRRET≠≠MOV≡≡R1≡≡R0≡≥ 011166 010100 FRRET: MOV R1,R0 ;R0 (result) ← LOC[LTAG[FOUND]] + 1.
≠MOV≡≡SP≡≡R2≡≥ 011170 012602 MOV (SP)+,R2 ;Restore R2
≠RTS≡≡PC≡≥ 011172 000207 RTS PC ;Done.
≡FEXACT≠≠MOV≡≡R1≡≡R2≡≥ 011174 010102 FEXACT: MOV R1,R2 ;
≠ADD≡≡R1≡≡R2≡≥ 011176 061102 ADD (R1),R2 ;R2 ← LOC[RTAG[FOUND]]
≠NEG≡≡R1≡≥ 011200 005421 NEG (R1)+ ;LTAG[FOUND] ← new (busy) count.
≠NEG≡≡R2≡≥ 011202 005442 NEG -(R2) ;RTAG[FOUND] ← new (busy) count.
≠BR≡≡FRRET≡≥ 011204 000770 BR FRRET ;Ready to return
≡FREERR≠≤HALERR≡≥ FREERR: HALERR FRMS1
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡FRMS1≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≡FROVFL≠≤HALERR≡≥ FROVFL: HALERR FRMS2
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡FRMS2≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≡FRMS1≠≤ASCIE≡≥ FRMS1: ASCIE </YOU ASKED FOR NEGATIVE AMOUNT OF FREE SPACE/>
≠.ASCIZ≡≠.EVEN≡≡FRMS2≠≤ASCIE≡≥ FRMS2: ASCIE /FREE STORAGE EXHAUSTED/
≠.ASCIZ≡≠.EVEN≡≥
≥
≥ ; Routine to release free storage. R0=LOC[LTAG[BLOCK]] + 1.
≥ ; Call the currently released block BLOCK, the adjacent one
≥ ; below LOW, and the adjacent one above HIGH.
≡RLFREE≠≠MOV≡≡R0≡≡R1≡≥ 011426 014001 RLFREE: MOV -(R0),R1 ;R1 ← LOC[LTAG[BLOCK]]
≠BGE≡≡RLFER2≡≥ 011430 002061 BGE RLFER2 ;Can't release available space.
≠MOV≡≡R0≡≡R1≡≥ 011432 010001 MOV R0,R1 ;R1 ← LOC[LTAG[BLOCK]]
≠SUB≡≡R0≡≡R0≡≥ 011434 161000 SUB (R0),R0 ;R0 ← LOC[LTAG[HIGH]]
≠CMP≡≡R1≡≡R0≡≥ 011436 021160 177776 CMP (R1),-2(R0) ;Do the two bdry tags agree?
≠BNE≡≡RLFER1≡≥ 011442 001031 BNE RLFER1 ;No. Storage munged!!
≠NEG≡≡R1≡≥ 011444 005411 NEG (R1) ;Count is now positive in LTAG[BLOCK].
≠TST≡≡R1≡≥ 011446 005761 177776 TST -2(R1) ;Is LOW available?
≠BLT≡≡MERGR≡≥ 011452 002411 BLT MERGR ;No. Cannot merge left.
≠ADD≡≡R1≡≡R1≡≥ 011454 066111 177776 ADD -2(R1),(R1) ;Yes. LTAG[BLOCK] ← New count
≠MOV≡≡R1≡≡R0≡≥ 011460 011160 177776 MOV (R1),-2(R0) ;RTAG[BLOCK] ← New count
≠MOV≡≡R0≡≡R1≡≥ 011464 010001 MOV R0,R1 ;
≠SUB≡≡R1≡≡R1≡≥ 011466 166101 177776 SUB -2(R1),R1 ;R1 ← LOC[LTAG[LOW]]
≠MOV≡≡R0≡≡R1≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 17
HALRTR PAL[HAL,HE] PAGE 2.2 Free storage management
≥ 011472 016011 177776 MOV -2(R0),(R1) ;LTAG[LOW] ← New count
≥ ;At this point, call LOW&BLOCK = BLOCK.
≡MERGR≠≠TST≡≡R0≡≥ 011476 005710 MERGR: TST (R0) ;Is HIGH available?
≠BLT≡≡RLRET≡≥ 011500 002407 BLT RLRET ;No. Prepare to return.
≠ADD≡≡R0≡≡R1≡≥ 011502 061011 ADD (R0),(R1) ;LTAG[BLOCK] ← New count
≠CMP≡≡FREEPT≡≡R0≡≥ 011504 026700 167156 CMP FREEPT,R0 ;Will FREEPT point into a vacuum?
≠BNE≡≡RL1≡≥ 011510 001002 BNE RL1 ;No.
≠MOV≡≡R1≡≡FREEPT≡≥ 011512 010167 167150 MOV R1,FREEPT ;Yes. Reset FREEPT ← LOC[LTAG[BLOCK]]
≡RL1≠≠ADD≡≡R0≡≡R0≡≥ 011516 061000 RL1: ADD (R0),R0 ;R0 ← LOC[RTAG[HIGH]] + 1
≥ ;At this point, call BLOCK&HIGH = BLOCK.
≡RLRET≠≠MOV≡≡R1≡≡R0≡≥ 011520 011160 177776 RLRET: MOV (R1),-2(R0) ;RTAG[BLOCK] ← New count
≠RTS≡≡PC≡≥ 011524 000207 RTS PC ;Done.
≡RLFER1≠≤HALERR≡≥ RLFER1: HALERR RLMS1
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RLMS1≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≡RLFER2≠≤HALERR≡≥ RLFER2: HALERR RLMS2
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RLMS2≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≡RLMS1≠≤ASCIE≡≥ RLMS1: ASCIE /RLFREE FEARS FREE STORAGE IS WIPED OUT/
≠.ASCIZ≡≠.EVEN≡≡RLMS2≠≤ASCIE≡≥ RLMS2: ASCIE /ATTEMPT TO FREE ALREADY AVAILABLE SPACE/
≠.ASCIZ≡≠.EVEN≡≠.INSRT≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 18
SMALLB PAL[HAL,HE] PAGE 2.2 Free storage management
≥ .INSRT SMALLB.PAL[HAL,HE]
≠COMMEN≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 19
SMALLB PAL[HAL,HE] PAGE 1 Free storage management
≥ COMMENT ⊗ VALID 00014 PAGES
≥ C REC PAGE DESCRIPTION
≥ C00001 00001
≥ C00002 00002 .SBTTL SMALL BLOCK ALLOCATOR
≥ C00006 00003 SMALL BLOCK DESCRIPTOR FORMAT
≥ C00009 00004 ROUTINE MAPPTR,<ROUT>
≥ C00012 00005 ROUTINE MARKPH
≥ C00014 00006 ROUTINE CPFYSP,<SPC>
≥ C00018 00007 ROUTINE CPFY
≥ C00019 00008 ROUTINE SWEEP
≥ C00022 00009 ROUTINE GC
≥ C00023 00010 GETSBK & GETBLK
≥ C00026 00011 FREBLK & FRESBK
≥ C00028 00012 ROUTINE NEWSPC,<SZ,IDF,NPB,GCF,NMN,NPC>
≥ C00030 00013 ROUTINE ADDBUF,<SPACE>
≥ C00032 00014 ROUTINE FSINI
≥ C00034 ENDMK
≥ C⊗;
≠.SBTTL≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 20
SMALLB PAL[HAL,HE] PAGE 2 SMALL BLOCK ALLOCATOR
≥ .SBTTL SMALL BLOCK ALLOCATOR
≥ ;Coded by RHT 9-Sept-1974
≥
≡SMBDBG≠≥ 000001 SMBDBG == 1 ;WE ARE DEBUGGING
≥
≥ ; Overview:
≥ ; The basic idea is to break up large blocks of storage
≥ ;into smaller, fixed size blocks, and then administer them.
≥ ;The routines given here provide a facility whereby a user
≥ ;can have a number of different "spaces" of fixed size blocks.
≥ ;Each space is described by an approximately 10 word descriptor
≥ ;block. All these descriptor blocks are linked together on
≥ ;a big chain (SIDLST), and each space is assumed to have
≥ ;asociated with it a unique 8-bit number (thus allowing up to
≥ ;256 spaces). Each space descriptor owns a linked list
≥ ;of buffers, with each buffer containing a number of blocks.
≥ ;Each space may be either collectable or uncollectable.
≥ ;Any block may be released explicitly, although if the
≥ ;space is collectable, this may be unwise. Also, collectable
≥ ;spaces are compactified by the garbage collector.
≥ ;As an efficiency measure, the first few indices (now, 1-10)
≥ ;are also kept in a table (SIDTBL).
≥ ;
≥ ;Blocks are allocated by the routines GETBLK & GETSBK:
≥ ;
≥ ; MOV #IDCODE,R0 ;IDCODE IS THE 8-BIT CODE FOR A
≥ ; JSR PC,GETBLK ;SPACE
≥ ;
≥ ; MOV #SPCDSC,R0 ;SPCDSC IS ADDRESS OF THE SPACE
≥ ; JSR PC,GETSBK ;DESCRIPTOR
≥ ;
≥ ;In either case, a pointer to a new block is returned in R0.
≥ ;If need be, the free space routine will call the garbage collector
≥ ;to get more space or (if the space is not collectable or
≥ ;garbage collection is disabled) it will call the large block
≥ ;routines to get another buffer. If garbage collection fails
≥ ;to produce a goodly surplus of blocks for some space, then
≥ ;additional buffers of new blocks will be obtained.
≥ ;
≥ ;Each small block has the following format:
≥ ; tag,,id ;tag is used in garbage collecting
≥ ; r0 →→ word 0 ;this is the word pointed to by getblk
≥ ; :
≥ ; word n
≥ ;
≥ ;blocks are zeroed before being returned. Although this is sometimes
≥ ;a bit extra overhead, it does prevent bugs and avoids the necessity
≥ ;for explicit clears all over the place.
≥ ;
HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 21
SMALLB PAL[HAL,HE] PAGE 2.1 SMALL BLOCK ALLOCATOR
≥ ;Blocks are freed by the routines FREBLK & FRESBK:
≥ ;
≥ ; MOV BLOCK,R0 ;POINT AT BLOCK TO KILL
≥ ; JSR PC,FREBLK
≥ ;
≥ ; MOV BLOCK,R0 ;POINT AT BLOCK TO KILL
≥ ; MOV #SPCDSC,R1 ;R1 POINTS AT SPACE DESCRIPTOR
≥ ; JSR PC,FRESBK
HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 22
SMALLB PAL[HAL,HE] PAGE 3 SMALL BLOCK ALLOCATOR
≥ ;SMALL BLOCK DESCRIPTOR FORMAT
≥
≡II≠≥ 000000 II == 0
≤XX≡≥ XX IDFLAG ;ACTUALLY A BYTE -- GETS PUT IN ID PART OF TAG WORD
≡II≡≡IDFLAG≠≡II≡≡II≠≤XX≡≥ XX MAPRTN ;ROUTINE TO BE CALLED ON MARK
≡II≡≡MAPRTN≠≡II≡≡II≠≤XX≡≥ XX SIZE ;How many words for a value cell in this type block.
≡II≡≡SIZE≠≡II≡≡II≠≤XX≡≥ XX NPERB ;NUMBER OF BLOCKS PER BUFFER
≡II≡≡NPERB≠≡II≡≡II≠≤XX≡≥ XX GCFG ;SET IF THIS IS NOT A COLLECTABLE AREA
≡II≡≡GCFG≠≡II≡≡II≠≤XX≡≥ XX NMIN ;MIN NUMBER OF FREE BLOCKS TO BE RETURNED BY GC
≡II≡≡NMIN≠≡II≡≡II≠≤XX≡≥ XX NPCT ;MIN % OF FREE BLOCKS TO BE RETURNED BY GC
≡II≡≡NPCT≠≡II≡≡II≠≤XX≡≥ XX NXTSID ;NEXT BLOCK ON ID CHAIN
≡II≡≡NXTSID≠≡II≡≡II≠≤XX≡≥ XX FFREE ;FREE LIST
≡II≡≡FFREE≠≡II≡≡II≠≤XX≡≥ XX FSTBUF ;OLDEST BUFFER
≡II≡≡FSTBUF≠≡II≡≡II≠≤XX≡≥ XX LSTBUF ;NEWEST BUFFER
≡II≡≡LSTBUF≠≡II≡≡II≠≤XX≡≥ XX NALLOC ;NUMBER ALLOCATED
≡II≡≡NALLOC≠≡II≡≡II≠≤XX≡≥ XX NFREE ;NUMBER FREE
≡II≡≡NFREE≠≡II≡≡II≠≡II≡≡SPCHDR≠≥ 000032 SPCHDR == II
≥
≥ ;; EACH BUFFER
≡II≠≥ 000000 II == 0
≤XX≡≥ XX NXTBUF ;NEXT BUFFER
≡II≡≡NXTBUF≠≡II≡≡II≠≤XX≡≥ XX PRVBUF ;PREVIOUS BUFFER
≡II≡≡PRVBUF≠≡II≡≡II≠≤XX≡≥ XX LSTBLK ;ADDRESS OF LAST BLOCK IN THIS BUFFER
≡II≡≡LSTBLK≠≡II≡≡II≠≤XX≡≥ XX FSTBLK ;POINTS AT FIRST LOCN
≡II≡≡FSTBLK≠≡II≡≡II≠≡II≡≡BUFHDR≠≥ 000010 BUFHDR == II
≥
≥ ;; EACH BLOCK
≡II≠≥ 000000 II == 0
≡TAG≠≥ 177777 TAG == -1 ;≠0 MEANS INUSE (USED IN GC)
≡TAGID≠≥ 177776 TAGID == -2 ;USED TO HOLD AN "ID" FOR THIS RECORD
≤XX≡≥ XX WORD0 ;FIRST DATA WORD
≡II≡≡WORD0≠≡II≡≡II≠≥
≥ ;;GC METHODS
≡II≠≥ 000000 II == 0
≤XX≡≥ XX METH ;ROUTINE TO CALL
≡II≡≡METH≠≡II≡≡II≠≤XX≡≥ XX NXTMTH ;NEXT ON CHAIN
≡II≡≡NXTMTH≠≡II≡≡II≠≥
≠.MACRO≡≤MMETH≠≥ .MACRO MMETH ROUT
≥ ROUT
≥ 0
≥ .ENDM
≥
≥ ;;SPECIAL SPACES
≥
≡SIDCNT≠≥ 000000 SIDCNT == 0;
≥
≠.MACRO≡≤SPC≠≥ .MACRO SPC ID,MMRT,SZ,NPB,GCF,NMN,NPC
≥ .IFNDF ID
≥ SIDCNT==SIDCNT+1
HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 23
SMALLB PAL[HAL,HE] PAGE 3.1 SMALL BLOCK ALLOCATOR
≥ ID==SIDCNT
≥ .ENDC
≥ ID ;IDFLAG
≥ MMRT ;MAPRTN
≥ SZ ;SIZE
≥ NPB ;NPERB
≥ GCF ;GCFG
≥ NMN ;NMIN
≥ NPC ;NPCT
≥ 0 ;NXTSID
≥ 0 ;FFREE
≥ 0 ;FSTBUF
≥ 0 ;LSTBUF
≥ 0 ;NALLOC
≥ 0 ;NFREE
≥ .ENDM
≥
≡MAXIDF≠≥ 000010 MAXIDF == 10 ;MAX INDEX INTO SIDTBL
≥
≡VCTSPC≠≤SPC≡≥ VCTSPC: SPC VCTID,MKRTJM,4,10,1,4,15
≠.IFNDF≡≡VCTID≡≡VCTID≡≡VCTID≡≡MKRTJM≡≡MKRTJM≡≥
≥
≡MMETHS≠≥ 012014 000000 MMETHS: 0 ;OWNS A LIST OF MARKING METHODS
≡GCOK≠≥ 012016 000000 GCOK: 0 ;SET IF GC IS OK NOW
≡CPFYOK≠≥ 012020 000000 CPFYOK: 0 ;SET IF COMPACTIFICATION IS OK
≡SIDLST≠≥ 012022 000000 SIDLST: 0 ;LIST OF SPACE ID BLOCKS
≡SIDTBL≠≥ 012024 000000 SIDTBL: 0
≠.BLKW≡≡MAXIDF≡≥ 012046 .BLKW MAXIDF
≤ROUTIN≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 24
SMALLB PAL[HAL,HE] PAGE 4 SMALL BLOCK ALLOCATOR
≥ ROUTINE MAPPTR,<ROUT>
≠.IFNB≡≡NNNN≠≠.IRP≡≡NNNN≡≡NNNN≠≠.IRP≡≡NNNN≡≡ROUT≠≡NNNN≡≡NNNN≠≡MAPPTR≠≥ ;;
≥ ;;ROUT TAKES A SINGLE PARAMETER (IN R0) WHICH IS A POINTER
≥ ;; TO A SMALL BLOCK. IT RETURNS (IN R0) A POINTER VALUE
≥ ;; WHICH IS TO BE STORED BACK IN THE POINTER CELL.
≥ ;;
≥
≥ ;; MAPPTR RUNS DOWN A LIST OF "MARKING METHODS" (MMETHS)
≥ ;; EACH METHOD IS ASSUMED TO BE RESPONSIBLE FOR SOME
≥ ;; BATCH OF POINTERS. FOR EACH POINTER IT FINDS, A
≥ ;; METHOD SHOULD CALL THE ROUTINE MARKR0 (VIA JSR PC)
≥ ;; IE, EACH MARKING METHOD SHOULD HAVE THE FORM
≥ ;; METH: R←#<first pointer>
≥ ;; WHILE R≠NULL DO
≥ ;; BEGIN
≥ ;; R0←(R);
≥ ;; JSR PC,MARKR0;
≥ ;; (R)←R0;
≥ ;; R←#<next pointer>;
≥ ;; END;
≥ ;; RETURN;
≥ ;;
≥ ;; MARKR0 DETERMINES THE TYPE OF THE RECORD (IE FINDS ITS SPACE
≥ ;; DESCRIPTOR. IT THEN DOES A
≥ ;; JSR PC,@MAPRTN(<space>)
≥ ;; FOR SPACES WHERE THERE ARE NO POINTER SUBFIELDS, THIS MAY BE JUST
≥ ;; MKRTJM (IE A JMP @ROUT(RF) ). IF THERE ARE POINTER SUBFIELDS, THEN
≥ ;; THE MAPRTN NEEDS TO BE MORE COMPLICATED:
≥ ;;
≥ ;; IF TAG(R0) THEN RTS PC;
≥ ;; JSR PC,@ROUT(RF);
≥ ;; PUSH R;
≥ ;; R←R0;
≥ ;; ∀ R0 | R0 is a pointer subfield of R DO
≥ ;; JSR PC,MARKR0;
≥ ;; R0←R;
≥ ;; POP R;
≥ ;; RTS PC;
≥ ;;
≥
≥ ;;MAPPTR: ;(IN CASE YOU HAD FORGOTTEN)
≠MOV≡≡R2≡≡SP≡≥ 012046 010246 MOV R2,-(SP) ;
≠MOV≡≡MMETHS≡≡R2≡≥ 012050 016702 177740 MOV MMETHS,R2 ;LIST OF MARKING METHS
≠BEQ≡≡MAPRTS≡≥ 012054 001413 BEQ MAPRTS ;DONE??
≡MAPLP≠≤CALL≡≥ MAPLP: CALL @METH(R2),<ROUT(RF)>
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡ROUT≡≡RF≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡METH≡≡R2≡≠MOV≡≡NXTMTH≡≡R2≡≡R2≡≥ 012076 016202 000002 MOV NXTMTH(R2),R2 ;NEXT METHOD
≠BNE≡≡MAPLP≡≥ 012102 001365 BNE MAPLP ;ITERATE
≡MAPRTS≠≠MOV≡≡SP≡≡R2≡≥ 012104 012602 MAPRTS: MOV (SP)+,R2 ;
≠RTS≡≡RF≡≥ 012106 000205 RTS RF ;RETURN
HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 25
SMALLB PAL[HAL,HE] PAGE 4.1 SMALL BLOCK ALLOCATOR
≥
≡MKRTJM≠≠JMP≡≡ROUT≡≡RF≡≥ 012110 000175 000002 MKRTJM: JMP @ROUT(RF) ;THIS IS THE APPROPRIATE
≥ ;MARKING INTRINSIC FOR CASES WHERE
≥ ;THERE ARE NO POINTER SUBFIELDS
≥
≡MARKR0≠≠JSR≡≡PC≡≡PTRSID≡≥ 012114 004767 001446 MARKR0: JSR PC,PTRSID ;GETS SPACE DESCRIPTOR INTO R1
≠JSR≡≡PC≡≡MAPRTN≡≡R1≡≥ 012120 004771 000002 JSR PC,@MAPRTN(R1) ;CALL APPROPRIATE MARKING INTRINSIC
≠RTS≡≡PC≡≥ 012124 000207 RTS PC
≥
≥ ;THE NEXT ROUTINE IS USED TO ADD A METHOD TO THE "MMETHS" LIST
≡LNKMTH≠≠MOV≡≡MMETHS≡≡NXTMTH≡≡R0≡≥ 012126 016760 177662 000002 LNKMTH: MOV MMETHS,NXTMTH(R0)
≠MOV≡≡R0≡≡MMETHS≡≥ 012134 010067 177654 MOV R0,MMETHS
≠RTS≡≡PC≡≥ 012140 000207 RTS PC
≤ROUTIN≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 26
SMALLB PAL[HAL,HE] PAGE 5 SMALL BLOCK ALLOCATOR
≥ ROUTINE MARKPH
≠.IFNB≡≡MARKPH≠≠MOV≡≡R2≡≡SP≡≥ 012142 010246 MOV R2,-(SP) ;
≠MOV≡≡R3≡≡SP≡≥ 012144 010346 MOV R3,-(SP) ;
≠MOV≡≡SIDLST≡≡R2≡≥ 012146 016702 177650 MOV SIDLST,R2 ;ALL SIZES
≠BEQ≡≡MKPHRT≡≥ 012152 001440 BEQ MKPHRT ;DONE ALREADY??
≡MKPH.1≠≠TST≡≡GCFG≡≡R2≡≥ 012154 005762 000010 MKPH.1: TST GCFG(R2) ;A GC SPACE??
≠BEQ≡≡MKPH.A≡≥ 012160 001422 BEQ MKPH.AD ;NO, GO ON TO NEXT
≠MOV≡≡SIZE≡≡R2≡≡R3≡≥ 012162 016203 000004 MOV SIZE(R2),R3 ;
≠INC≡≡R3≡≥ 012166 005203 INC R3 ;ONE FOR TAG WORD
≠ASL≡≡R3≡≥ 012170 006303 ASL R3 ;WORDS TO BYTES
≠MOV≡≡FSTBUF≡≡R2≡≡R1≡≥ 012172 016201 000022 MOV FSTBUF(R2),R1 ;CLEAR THIS BUFFER
≡MKP.02≠≠MOV≡≡FSTBLK≡≡R1≡≡R0≡≥ 012176 016100 000006 MKP.02: MOV FSTBLK(R1),R0 ;FIRST BLOCK
≡MKPH.2≠≠CMP≡≡R0≡≡LSTBLK≡≡R1≡≥ 012202 020061 000004 MKPH.2: CMP R0,LSTBLK(R1) ;DONE THIS BUFFER?
≠BGT≡≡MKPH.3≡≥ 012206 003004 BGT MKPH.3 ;IF SO, GO ON TO NEXT
≠CLRB≡≡TAG≡≡R0≡≥ 012210 105060 177777 CLRB TAG(R0) ;CLEAR TAG
≠ADD≡≡R3≡≡R0≡≥ 012214 060300 ADD R3,R0 ;BUMP POINTER TO NEXT
≠BR≡≡MKPH.2≡≥ 012216 000771 BR MKPH.2 ;ITERATE
≡MKPH.3≠≠MOV≡≡NXTBUF≡≡R1≡≡R1≡≥ 012220 016101 000000 MKPH.3: MOV NXTBUF(R1),R1 ;ON TO NEXT BUFFER
≠BNE≡≡MKP.02≡≥ 012224 001364 BNE MKP.02 ;IF WE HAVE ONE
≡MKPH.A≠≠MOV≡≡NXTSID≡≡R2≡≡R2≡≥ 012226 016202 000016 MKPH.AD:MOV NXTSID(R2),R2 ;GO ON TO NEXT SPACE
≠BNE≡≡MKPH.1≡≥ 012232 001350 BNE MKPH.1 ;
≥
≤CALL≡≥ CALL MAPPTR,<#MKROUT> ;DO THE ACTUAL MARKING
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡MKROUT≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡MAPPTR≡≥
≡MKPHRT≠≠MOV≡≡SP≡≡R3≡≥ 012254 012603 MKPHRT: MOV (SP)+,R3 ;RESTORE
≠MOV≡≡SP≡≡R2≡≥ 012256 012602 MOV (SP)+,R2
≠RTS≡≡RF≡≥ 012260 000205 RTS RF
≥
≡MKROUT≠≠MOVB≡≡TAG≡≡R0≡≥ 012262 112760 000377 177777 MKROUT: MOVB #377,TAG(R0) ;
≠RTS≡≡PC≡≥ 012270 000207 RTS PC ;
≥
≤ROUTIN≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 27
SMALLB PAL[HAL,HE] PAGE 6 SMALL BLOCK ALLOCATOR
≥ ROUTINE CPFYSP,<SPC>
≠.IFNB≡≡NNNN≠≠.IRP≡≡NNNN≡≡NNNN≠≠.IRP≡≡NNNN≡≡SPC≠≡NNNN≡≡NNNN≠≡CPFYSP≠≥ ;;
≥ ;; PERFORMS ALL DATA MOVING REQUIRED TO COMPACTIFY ONE SIZE SPACE
≥ ;;
≠MOV≡≡R2≡≡SP≡≥ 012272 010246 MOV R2,-(SP) ;SAVE SOME ACS
≠MOV≡≡R3≡≡SP≡≥ 012274 010346 MOV R3,-(SP) ;
≠MOV≡≡R4≡≡SP≡≥ 012276 010446 MOV R4,-(SP) ;
≠MOV≡≡SPC≡≡RF≡≡R2≡≥ 012300 016502 000002 MOV SPC(RF),R2 ;SPACE DSCR
≠MOV≡≡FSTBUF≡≡R2≡≡R3≡≥ 012304 016203 000022 MOV FSTBUF(R2),R3 ;OLDEST
≠MOV≡≡LSTBUF≡≡R2≡≡R4≡≥ 012310 016204 000024 MOV LSTBUF(R2),R4 ;NEWEST
≠JSR≡≡PC≡≡NXF.0≡≥ 012314 004767 000100 JSR PC,NXF.0 ;NEXT FREE INTO 1
≥ ;MAY MODIFY R3
≠BEQ≡≡CPFY.2≡≥ 012320 001433 BEQ CPFY.2 ;NO FREE
≠JSR≡≡PC≡≡NXR.0≡≥ 012322 004767 000144 JSR PC,NXR.0 ;GET A RECORD TO MOVE
≥ ;INTO R1 (MAY MUNCH R0)
≠BEQ≡≡CPFY.2≡≥ 012326 001430 BEQ CPFY.2 ;
≡CPFY.1≠≠MOV≡≡R1≡≡SP≡≥ 012330 010146 CPFY.1: MOV R1,-(SP) ;SAVE THESE
≠MOV≡≡R0≡≡SP≡≥ 012332 010046 MOV R0,-(SP) ;
≠MOVB≡≡TAG≡≡R0≡≥ 012334 112760 000377 177777 MOVB #377,TAG(R0) ;
≠CLRB≡≡TAG≡≡R1≡≥ 012342 105061 177777 CLRB TAG(R1) ;
≠MOV≡≡SIZE≡≡R2≡≡R2≡≥ 012346 016202 000004 MOV SIZE(R2),R2 ;
≡CPYR≠≠MOV≡≡R1≡≡R0≡≥ 012352 012120 CPYR: MOV (R1)+,(R0)+ ;COPY RECORD
≠DEC≡≡R2≡≥ 012354 005302 DEC R2 ;COUNT DOWN
≠BGT≡≡CPYR≡≥ 012356 003375 BGT CPYR ;DONE??
≠MOV≡≡SPC≡≡RF≡≡R2≡≥ 012360 016502 000002 MOV SPC(RF),R2 ;YES
≠MOV≡≡SP≡≡R0≡≥ 012364 012600 MOV (SP)+,R0 ;GET ACS BACK
≠MOV≡≡SP≡≡R1≡≥ 012366 012601 MOV (SP)+,R1 ;
≠MOV≡≡R0≡≡WORD0≡≡R1≡≥ 012370 010061 000000 MOV R0,WORD0(R1) ;POINT AT THIS ONE
≠JSR≡≡PC≡≡NXF.NX≡≥ 012374 004767 000032 JSR PC,NXF.NX ;NEXT FREE
≠BEQ≡≡CPFY.2≡≥ 012400 001403 BEQ CPFY.2
≠JSR≡≡PC≡≡NXR.NX≡≥ 012402 004767 000076 JSR PC,NXR.NX ;NEXT RECORD
≠BNE≡≡CPFY.1≡≥ 012406 001350 BNE CPFY.1 ;PROCESS THAT ONE
≡CPFY.2≠≥ CPFY.2:
≠MOV≡≡SP≡≡R4≡≥ 012410 012604 MOV (SP)+,R4 ;
≠MOV≡≡SP≡≡R3≡≥ 012412 012603 MOV (SP)+,R3 ;
≠MOV≡≡SP≡≡R2≡≥ 012414 012602 MOV (SP)+,R2
≠RTS≡≡RF≡≥ 012416 000205 RTS RF
≥
≡NXF.0≠≠MOV≡≡FSTBLK≡≡R3≡≡R0≡≥ 012420 016300 000006 NXF.0: MOV FSTBLK(R3),R0 ;FIND A FREE BLOCK
≡NXF.1≠≠TSTB≡≡TAG≡≡R0≡≥ 012424 105760 177777 NXF.1: TSTB TAG(R0) ;FREE
≠BEQ≡≡NXF.4≡≥ 012430 001416 BEQ NXF.4 ;YES
≡NXF.NX≠≠ADD≡≡SIZE≡≡R2≡≡R0≡≥ 012432 066200 000004 NXF.NX: ADD SIZE(R2),R0 ;LOOK AT NEXT
≠ADD≡≡SIZE≡≡R2≡≡R0≡≥ 012436 066200 000004 ADD SIZE(R2),R0 ;ADD TWICE SINCE WANT TRUE ADDRESS
≠TST≡≡R0≡≥ 012442 005720 TST (R0)+ ;ADD IN TAG WORD OFFSET
≠CMP≡≡R0≡≡LSTBLK≡≡R3≡≥ 012444 020063 000004 CMP R0,LSTBLK(R3) ;MORE TO TRY??
≠BLE≡≡NXF.1≡≥ 012450 003765 BLE NXF.1 ;TRY AGAIN
≠MOV≡≡NXTBUF≡≡R3≡≡R3≡≥ 012452 016303 000000 MOV NXTBUF(R3),R3 ;NEXT NEWEST BUFFER
≠BEQ≡≡NXF.3≡≥ 012456 001402 BEQ NXF.3 ;LOOK THERE
≠CMP≡≡R3≡≡R4≡≥ 012460 020304 CMP R3,R4 ;IF NOT TO THE R SUPPLIER
≠BNE≡≡NXF.0≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 28
SMALLB PAL[HAL,HE] PAGE 6.1 SMALL BLOCK ALLOCATOR
≥ 012462 001356 BNE NXF.0
≡NXF.3≠≠CLR≡≡R0≡≥ 012464 005000 NXF.3: CLR R0
≡NXF.4≠≠MOV≡≡R0≡≡R0≡≥ 012466 010000 NXF.4: MOV R0,R0 ;GET FLAGS CORRECT
≠RTS≡≡PC≡≥ 012470 000207 RTS PC
≥
≥
≡NXR.0≠≠MOV≡≡FSTBLK≡≡R4≡≡R0≡≥ 012472 016400 000006 NXR.0: MOV FSTBLK(R4),R0 ;FIND A FULL BLOCK
≡NXR.1≠≠TSTB≡≡TAG≡≡R0≡≥ 012476 105760 177777 NXR.1: TSTB TAG(R0) ;FULL
≠BNE≡≡NXF.4≡≥ 012502 001371 BNE NXF.4 ;YES
≡NXR.NX≠≠ADD≡≡SIZE≡≡R2≡≡R0≡≥ 012504 066200 000004 NXR.NX: ADD SIZE(R2),R0 ;LOOK AT NEXT
≠ADD≡≡SIZE≡≡R2≡≡R0≡≥ 012510 066200 000004 ADD SIZE(R2),R0 ;ADD TWICE SINCE WANT TRUE ADDRESS
≠TST≡≡R0≡≥ 012514 005720 TST (R0)+ ;ADD IN TAG WORD OFFSET
≠CMP≡≡R0≡≡LSTBLK≡≡R4≡≥ 012516 020064 000004 CMP R0,LSTBLK(R4) ;MORE TO TRY??
≠BLE≡≡NXR.1≡≥ 012522 003765 BLE NXR.1 ;TRY AGAIN
≠MOV≡≡PRVBUF≡≡R4≡≡R4≡≥ 012524 016404 000002 MOV PRVBUF(R4),R4 ;NEXT NEWEST BUFFER
≠BEQ≡≡NXR.3≡≥ 012530 001402 BEQ NXR.3 ;LOOK THERE
≠CMP≡≡R3≡≡R4≡≥ 012532 020304 CMP R3,R4 ;IF NOT TO THE R SUPPLIER
≠BNE≡≡NXF.0≡≥ 012534 001331 BNE NXF.0
≡NXR.3≠≠CLR≡≡R0≡≥ 012536 005000 NXR.3: CLR R0
≡NXR.4≠≠MOV≡≡R0≡≡R0≡≥ 012540 010000 NXR.4: MOV R0,R0 ;GET FLAGS CORRECT
≠RTS≡≡PC≡≥ 012542 000207 RTS PC
≤ROUTIN≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 29
SMALLB PAL[HAL,HE] PAGE 7 SMALL BLOCK ALLOCATOR
≥ ROUTINE CPFY
≠.IFNB≡≡CPFY≠≠MOV≡≡R2≡≡SP≡≥ 012544 010246 MOV R2,-(SP)
≠MOV≡≡SIDLST≡≡R2≡≥ 012546 016702 177250 MOV SIDLST,R2 ;LIST OF ALL SIZES
≠BEQ≡≡CPFYXX≡≥ 012552 001415 BEQ CPFYXX ;NULL LIST??
≡CPFYLP≠≠TST≡≡GCFG≡≡R2≡≥ 012554 005762 000010 CPFYLP: TST GCFG(R2) ;COLLECTABLE??
≠BEQ≡≡CPFYNX≡≥ 012560 001407 BEQ CPFYNX ;BR IF NOT
≤CALL≡≥ CALL CPFYSP,<R2> ;COMPACTIFY THIS SPACE
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡R2≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡CPFYSP≡≡CPFYNX≠≠MOV≡≡NXTSID≡≡R2≡≡R2≡≥ 012600 016202 000016 CPFYNX: MOV NXTSID(R2),R2
≠BNE≡≡CPFYLP≡≥ 012604 001363 BNE CPFYLP
≡CPFYXX≠≤CALL≡≥ CPFYXX: CALL MAPPTR,<#MUNLNK> ;MUNCH ALL LINKS
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡MUNLNK≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡MAPPTR≡≥ ; **** HERE IS THE SPOT WHERE YOU SHOULD WORRY ABOUT
≥ ; GETTING RID OF EXCESS BUFFER BLOCKS ****
≡CPFYRT≠≠MOV≡≡SP≡≡R2≡≥ 012626 012602 CPFYRT: MOV (SP)+,R2 ;RETURN
≠RTS≡≡RF≡≥ 012630 000205 RTS RF
≥
≡MUNLNK≠≠MOV≡≡R0≡≡R1≡≥ 012632 011001 MUNLNK: MOV (R0),R1 ;CALLED WITH R0 →→ A PTR
≠TST≡≡TAG≡≡R1≡≥ 012634 005761 177777 TST TAG(R1) ;DID WE MOVE IT ??
≠BNE≡≡MUNRTS≡≥ 012640 001002 BNE MUNRTS ;
≠MOV≡≡WORD0≡≡R1≡≡R0≡≥ 012642 016110 000000 MOV WORD0(R1),(R0) ;YES, PUT NEW POINTER IN PLACE
≡MUNRTS≠≠RTS≡≡PC≡≥ 012646 000207 MUNRTS: RTS PC ;
≥
≤ROUTIN≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 30
SMALLB PAL[HAL,HE] PAGE 8 SMALL BLOCK ALLOCATOR
≥ ROUTINE SWEEP
≠.IFNB≡≡SWEEP≠≠MOV≡≡R2≡≡SP≡≥ 012650 010246 MOV R2,-(SP) ;
≠MOV≡≡SIDLST≡≡R2≡≥ 012652 016702 177144 MOV SIDLST,R2 ;LIST OF SIZES
≠BEQ≡≡SWP.X≡≥ 012656 001405 BEQ SWP.X
≡SWP.LP≠≠JSR≡≡PC≡≡SWP.≡≥ 012660 004767 000030 SWP.LP: JSR PC,SWP. ;GO SWEEP ONE AREA
≠MOV≡≡NXTSID≡≡R2≡≡R2≡≥ 012664 016202 000016 MOV NXTSID(R2),R2 ;ITERATE
≠BNE≡≡SWP.LP≡≥ 012670 001373 BNE SWP.LP ;
≡SWP.X≠≠MOV≡≡SP≡≡R2≡≥ 012672 012602 SWP.X: MOV (SP)+,R2 ;
≠RTS≡≡RF≡≥ 012674 000205 RTS RF ;
≥
≤ROUTIN≡≥ ROUTINE SWEEP1,<SPCC>
≠.IFNB≡≡NNNN≠≠.IRP≡≡NNNN≡≡NNNN≠≠.IRP≡≡NNNN≡≡SPCC≠≡NNNN≡≡NNNN≠≡SWEEP1≠≠MOV≡≡R2≡≡SP≡≥ 012676 010246 MOV R2,-(SP) ;SAVE REGISTERS
≠MOV≡≡SPCC≡≡RF≡≡R2≡≥ 012700 016502 000002 MOV SPCC(RF),R2 ;GET A SPACE
≠JSR≡≡PC≡≡SWP.≡≥ 012704 004767 000004 JSR PC,SWP. ;SWEEP ONE AREA
≡SWP.XX≠≠MOV≡≡SP≡≡R2≡≥ 012710 012602 SWP.XX: MOV (SP)+,R2
≠RTS≡≡RF≡≥ 012712 000205 RTS RF
≥
≡SWP.≠≠TST≡≡GCFG≡≡R2≡≥ 012714 005762 000010 SWP.: TST GCFG(R2) ;IS THIS SPACE FOR SWEEPING??
≠BNE≡≡SWP.00≡≥ 012720 001001 BNE SWP.00 ;
≠RTS≡≡PC≡≥ 012722 000207 RTS PC ;NO
≡SWP.00≠≠MOV≡≡R3≡≡SP≡≥ 012724 010346 SWP.00: MOV R3,-(SP) ;YES
≠MOV≡≡R4≡≡SP≡≥ 012726 010446 MOV R4,-(SP) ;
≠CLR≡≡FFREE≡≡R2≡≥ 012730 005062 000020 CLR FFREE(R2) ;WILL BUILD A REAL FREE LIST
≠CLR≡≡NFREE≡≡R2≡≥ 012734 005062 000030 CLR NFREE(R2) ;SINCE WE WILL FIX COUNTS
≠CLR≡≡NALLOC≡≡R2≡≥ 012740 005062 000026 CLR NALLOC(R2) ;
≠MOV≡≡FSTBUF≡≡R2≡≡R3≡≥ 012744 016203 000022 MOV FSTBUF(R2),R3 ;OLDEST BUFFER
≠BEQ≡≡SWP.3≡≥ 012750 001432 BEQ SWP.3 ;IF ANY
≠MOV≡≡SIZE≡≡R2≡≡R4≡≥ 012752 016204 000004 MOV SIZE(R2),R4 ;COMPUTE SIZE
≠INC≡≡R4≡≥ 012756 005204 INC R4 ;IN BYTES OF WHOLE THING
≠ASL≡≡R4≡≥ 012760 006304 ASL R4 ;
≡SWP.01≠≠MOV≡≡FSTBLK≡≡R3≡≡R0≡≥ 012762 016300 000006 SWP.01: MOV FSTBLK(R3),R0 ;GET A BLK
≡SWP.1≠≠TSTB≡≡TAG≡≡R0≡≥ 012766 105760 177777 SWP.1: TSTB TAG(R0) ;ALLOCATED?
≠BEQ≡≡SWP.1N≡≥ 012772 001403 BEQ SWP.1N ;NO
≠INC≡≡NALLOC≡≡R2≡≥ 012774 005262 000026 INC NALLOC(R2) ;YES
≠BR≡≡SWP.2≡≥ 013000 000407 BR SWP.2
≡SWP.1N≠≠INC≡≡NFREE≡≡R2≡≥ 013002 005262 000030 SWP.1N: INC NFREE(R2) ;LINK UP A FREE
≠MOV≡≡FFREE≡≡R2≡≡WORD0≡≡R0≡≥ 013006 016260 000020 000000 MOV FFREE(R2),WORD0(R0)
≠MOV≡≡R0≡≡FFREE≡≡R2≡≥ 013014 010062 000020 MOV R0,FFREE(R2)
≡SWP.2≠≠ADD≡≡R4≡≡R0≡≥ 013020 060400 SWP.2: ADD R4,R0 ;BUMP POINTER TO NEXT IN BUFFER
≠CMP≡≡R0≡≡LSTBLK≡≡R3≡≥ 013022 020063 000004 CMP R0,LSTBLK(R3) ;DONE BUFFER??
≠BLE≡≡SWP.1≡≥ 013026 003757 BLE SWP.1 ;NO
≠MOV≡≡NXTBUF≡≡R3≡≡R3≡≥ 013030 016303 000000 MOV NXTBUF(R3),R3 ;YES GO ON TO NEXT
≠BNE≡≡SWP.01≡≥ 013034 001352 BNE SWP.01 ;IF THERE IS ONE
≡SWP.3≠≠CMP≡≡NFREE≡≡R2≡≡NMIN≡≡R2≡≥ 013036 026262 000030 000012 SWP.3: CMP NFREE(R2),NMIN(R2) ;NEED MORE??
≠BGT≡≡SWP.5≡≥ 013044 003010 BGT SWP.5 ;AT LEAST HAVE MIN NUMBER
≡SWP.4≠≤CALL≡≥ SWP.4: CALL ADDBUF,<R2> ;NO, ADD A BUFFER FULL
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡R2≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡ADDBUF≡≠BR≡≡SWP.3≡≥ 013064 000764 BR SWP.3 ;AND TRY AGAIN
≡SWP.5≠≠MOV≡≡NFREE≡≡R2≡≡R0≡≥ 013066 016200 000030 SWP.5: MOV NFREE(R2),R0 ;SEE IF HIGH ENOUGH PERCENTAGE
≠ADD≡≡NALLOC≡≡R2≡≡R0≡≥ 013072 066200 000026 ADD NALLOC(R2),R0 ;OF FREES
≠MUL≡≡NPCT≡≡R2≡≡R0≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 31
SMALLB PAL[HAL,HE] PAGE 8.1 SMALL BLOCK ALLOCATOR
≥ 013076 070062 000014 MUL NPCT(R2),R0 ;
≠DIV≡≡R0≡≥ 013102 071027 000144 DIV #144,R0 ; NPCT*(NFREE+NALLOC)/=100
≠CMP≡≡NFREE≡≡R2≡≡R0≡≥ 013106 026200 000030 CMP NFREE(R2),R0 ;
≠BGT≡≡SWP.6≡≥ 013112 003010 BGT SWP.6 ;IF DONT HAVE ENOUGH
≤CALL≡≥ CALL ADDBUF,<R2> ;GET A BUFFER LOAD
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡R2≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡ADDBUF≡≠BR≡≡SWP.5≡≥ 013132 000755 BR SWP.5 ;AND TRY AGAIN
≡SWP.6≠≠MOV≡≡SP≡≡R4≡≥ 013134 012604 SWP.6: MOV (SP)+,R4 ;RESTORE
≠MOV≡≡SP≡≡R3≡≥ 013136 012603 MOV (SP)+,R3
≠RTS≡≡PC≡≥ 013140 000207 RTS PC
≥
≤ROUTIN≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 32
SMALLB PAL[HAL,HE] PAGE 9 SMALL BLOCK ALLOCATOR
≥ ROUTINE GC
≠.IFNB≡≡GC≠≤CALL≡≥ CALL MARKPH ;MARK EVERYONE
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡MARKPH≡≠TST≡≡CPFYOK≡≥ 013156 005767 176636 TST CPFYOK ;IF DONT WANT COMPACTIFICATION
≠BEQ≡≡SWPPIT≡≥ 013162 001406 BEQ SWPPIT ;THEN DONT DO IT
≤CALL≡≥ CALL CPFY ;COMPACTIFY
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡CPFY≡≡SWPPIT≠≤CALL≡≥ SWPPIT: CALL SWEEP ;SWEEP UP LOOSE GARBAGE
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡SWEEP≡≠RTS≡≡RF≡≥ 013214 000205 RTS RF
HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 33
SMALLB PAL[HAL,HE] PAGE 10 SMALL BLOCK ALLOCATOR
≥ ;GETSBK & GETBLK
≥ ;
≥
≡GETSBK≠≥ GETSBK:
≥ ;
≥ ; MOV [SIZE DESCRIPTOR],R0
≥ ; JSR PC,GETBLK
≥ ; <RETURNS WITH A BLOCK IN R0>
≥ ;
≠MOV≡≡R0≡≡R1≡≥ 013216 010001 MOV R0,R1
≡GETBL1≠≠TST≡≡R1≡≥ 013220 005701 GETBL1: TST R1 ;ERROR TRAP
≠BEQ≡≡GETBER≡≥ 013222 001457 BEQ GETBER
≠MOV≡≡FFREE≡≡R1≡≡R0≡≥ 013224 016100 000020 MOV FFREE(R1),R0 ;R0 ← FIRST FREE
≠BNE≡≡GETBLX≡≥ 013230 001027 BNE GETBLX ;DID WE GET ONE
≠MOV≡≡R1≡≡SP≡≥ 013232 010146 MOV R1,-(SP) ;NO,
≠TST≡≡GCFG≡≡R1≡≥ 013234 005761 000010 TST GCFG(R1) ;IS GC OK FOR THIS AREA?
≠BEQ≡≡GETADB≡≥ 013240 001403 BEQ GETADB ;NO, MUST ADD
≠TST≡≡GCOK≡≥ 013242 005767 176550 TST GCOK ;IS GARBAGE COLLECTION OK AT ALL
≠BNE≡≡GETGC≡≥ 013246 001010 BNE GETGC ;
≡GETADB≠≤CALL≡≥ GETADB: CALL ADDBUF,<R1> ;NO, JUST GET A BUFFER
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡R1≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡ADDBUF≡≠BR≡≡GETBXX≡≥ 013266 000406 BR GETBXX ;
≡GETGC≠≤CALL≡≥ GETGC: CALL GC ;YES, GC
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡GC≡≡GETBXX≠≠MOV≡≡SP≡≡R1≡≥ 013304 012601 GETBXX: MOV (SP)+,R1 ;
≠BR≡≡GETBL1≡≥ 013306 000744 BR GETBL1
≡GETBLX≠≠MOV≡≡WORD0≡≡R0≡≡FFREE≡≡R1≡≥ 013310 016061 000000 000020 GETBLX: MOV WORD0(R0),FFREE(R1) ;NEW FREE LIST
≠INC≡≡NALLOC≡≡R1≡≥ 013316 005261 000026 INC NALLOC(R1) ;ADJUST COUNTS
≠DEC≡≡NFREE≡≡R1≡≥ 013322 005361 000030 DEC NFREE(R1)
≠MOVB≡≡IDFLAG≡≡R1≡≡TAGID≡≡R0≡≥ 013326 116160 000000 177776 MOVB IDFLAG(R1),TAGID(R0) ;REMEMBER WHAT IT IS
≠MOV≡≡R0≡≡SP≡≥ 013334 010046 MOV R0,-(SP) ;SAVE POINTER TO BLOCK
≠MOV≡≡SIZE≡≡R1≡≡R1≡≥ 013336 016101 000004 MOV SIZE(R1),R1 ;WORD COUNT
≡GETB.C≠≠CLR≡≡R0≡≥ 013342 005020 GETB.C: CLR (R0)+ ;CLEAR A WORD
≠DEC≡≡R1≡≥ 013344 005301 DEC R1 ;COUNT DOWN
≠BGT≡≡GETB.C≡≥ 013346 003375 BGT GETB.C ;UNTIL DONE
≠MOV≡≡SP≡≡R0≡≥ 013350 012600 MOV (SP)+,R0 ;RETURN VALUE BACK
≠RTS≡≡PC≡≥ 013352 000207 RTS PC
≥
≥ ;
≥ ; MOV #ID,R0
≥ ; JSR PC,GETBLK
≥ ;
≡GETBLK≠≠JSR≡≡PC≡≡GETSID≡≥ 013354 004767 000142 GETBLK: JSR PC,GETSID ;SET UP SPC DSCR IN R1
≠BR≡≡GETBL1≡≥ 013360 000717 BR GETBL1
≥
≡GETBER≠≤HALERR≡≥ GETBER: HALERR GERMSG
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡GERMSG≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≠CLR≡≡R0≡≥ 013430 005000 CLR R0
≠RTS≡≡PC≡≥ 013432 000207 RTS PC
≥
≡GERMSG≠≤ASCIE≡≥ GERMSG: ASCIE /ATTEMPT TO ALLOCATE RECORD WITHOUT GIVING DESCRIPTOR/
≠.ASCIZ≡≠.EVEN≡≥
≡GETSID≠≠MOV≡≡R0≡≡R1≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 34
SMALLB PAL[HAL,HE] PAGE 10.1 SMALL BLOCK ALLOCATOR
≥ 013522 010001 GETSID: MOV R0,R1
≠CMP≡≡R0≡≡MAXIDF≡≥ 013524 020027 000010 CMP R0,#MAXIDF ;IN THE TABLE?
≠BGT≡≡GETS.1≡≥ 013530 003004 BGT GETS.1 ;NO
≠ASL≡≡R1≡≥ 013532 006301 ASL R1
≠MOV≡≡SIDTBL≡≡R1≡≡R1≡≥ 013534 016101 012024 MOV SIDTBL(R1),R1 ;YES
≡GETS.X≠≠RTS≡≡PC≡≥ 013540 000207 GETS.X: RTS PC ;
≡GETS.1≠≠MOV≡≡SIDLST≡≡R1≡≥ 013542 016701 176254 GETS.1: MOV SIDLST,R1 ;SEARCH CHAIN
≠BEQ≡≡GETS.X≡≥ 013546 001774 BEQ GETS.X
≡GETS.2≠≠CMP≡≡R0≡≡IDFLAG≡≡R1≡≥ 013550 020061 000000 GETS.2: CMP R0,IDFLAG(R1) ;THIS ONE??
≠BNE≡≡GETS.X≡≥ 013554 001371 BNE GETS.X ;YES
≠MOV≡≡NXTSID≡≡R1≡≡R1≡≥ 013556 016101 000016 MOV NXTSID(R1),R1 ;NO, TRY NEXT
≠BNE≡≡GETS.2≡≥ 013562 001372 BNE GETS.2
≠RTS≡≡PC≡≥ 013564 000207 RTS PC
≥
≡PTRSID≠≠MOV≡≡R0≡≡SP≡≥ 013566 010046 PTRSID: MOV R0,-(SP) ;SINCE GETSID WILL MUNCH
≠MOVB≡≡TAGID≡≡R0≡≡R0≡≥ 013570 116000 177776 MOVB TAGID(R0),R0 ;THE ID FLAG
≠JSR≡≡PC≡≡GETSID≡≥ 013574 004767 177722 JSR PC,GETSID ;GET SID INTO R1
≠MOV≡≡SP≡≡R0≡≥ 013600 012600 MOV (SP)+,R0 ;GET PTR BACK
≠RTS≡≡PC≡≥ 013602 000207 RTS PC
HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 35
SMALLB PAL[HAL,HE] PAGE 11 SMALL BLOCK ALLOCATOR
≥ ;FREBLK & FRESBK
≥ ; MOV BLK,R0
≥ ; JSR PC,FREBLK
≥ ;
≡FREBLK≠≠MOV≡≡SIDLST≡≡R1≡≥ 013604 016701 176212 FREBLK: MOV SIDLST,R1 ;FIND THE SPACE
≠BEQ≡≡FREBER≡≥ 013610 001423 BEQ FREBER ;THIS CAME FROM
≡FREB.1≠≠CMPB≡≡TAGID≡≡R0≡≡IDFLAG≡≡R1≡≥ 013612 126061 177776 000000 FREB.1: CMPB TAGID(R0),IDFLAG(R1) ;WAS IT THIS AREA
≠BNE≡≡FREB.2≡≥ 013620 001014 BNE FREB.2 ;NO
≡FREB.≠≠MOV≡≡FFREE≡≡R1≡≡WORD0≡≡R0≡≥ 013622 016160 000020 000000 FREB.: MOV FFREE(R1),WORD0(R0);FOUND THE AREA, PUT ON FREE CHAIN
≠MOV≡≡R0≡≡FFREE≡≡R1≡≥ 013630 010061 000020 MOV R0,FFREE(R1)
≠INC≡≡NFREE≡≡R1≡≥ 013634 005261 000030 INC NFREE(R1) ;ADJUST COUNTS
≠DEC≡≡NALLOC≡≡R1≡≥ 013640 005361 000026 DEC NALLOC(R1)
≠CLRB≡≡TAG≡≡R0≡≥ 013644 105060 177777 CLRB TAG(R0) ;JUST FOR RANDOMNESS
≠RTS≡≡PC≡≥ 013650 000207 RTS PC ;DONE
≡FREB.2≠≠MOV≡≡NXTSID≡≡R1≡≡R1≡≥ 013652 016101 000016 FREB.2: MOV NXTSID(R1),R1 ;LOOK AT NEXT
≠BNE≡≡FREB.1≡≥ 013656 001355 BNE FREB.1 ;ITERATE
≡FREBER≠≤HALERR≡≥ FREBER: HALERR FRERMS
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡FRERMS≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≡FRERMS≠≤ASCIE≡≥ FRERMS: ASCIE /ATTEMPT TO DELETE A BLOCK FROM AN AREA I CANNOT FIND/
≠.ASCIZ≡≠.EVEN≡≠RTS≡≡PC≡≥ 014014 000207 RTS PC
≥
≡FRESBK≠≠CMPB≡≡TAGID≡≡R0≡≡IDFLAG≡≡R1≡≥ 014016 126061 177776 000000 FRESBK: CMPB TAGID(R0),IDFLAG(R1) ;BE SURE THIS IS OK
≠BEQ≡≡FREB.≡≥ 014024 001676 BEQ FREB. ;WE WIN
≤HALERR≡≥ HALERR FRBER2
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡FRBER2≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≠BR≡≡FREB.≡≥ 014074 000652 BR FREB. ;DO IT ANYHOW IF CONTINUES IT
≥
≡FRBER2≠≤ASCIE≡≥ FRBER2: ASCIE /ID DISAGREEMENT FOR FRESBK/
≠.ASCIZ≡≠.EVEN≡≤ROUTIN≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 36
SMALLB PAL[HAL,HE] PAGE 12 SMALL BLOCK ALLOCATOR
≥ ROUTINE NEWSPC,<SZ,IDF,NPB,GCF,NMN,NPC>
≠.IFNB≡≡NNNN≠≠.IRP≡≡NNNN≡≡NNNN≠≡NNNN≡≡NNNN≠≡NNNN≡≡NNNN≠≡NNNN≡≡NNNN≠≡NNNN≡≡NNNN≠≡NNNN≡≡NNNN≠≠.IRP≡≡NNNN≡≡SZ≠≡NNNN≡≡NNNN≠≡NNNN≡≡IDF≠≡NNNN≡≡NNNN≠≡NNNN≡≡NPB≠≡NNNN≡≡NNNN≠≡NNNN≡≡GCF≠≡NNNN≡≡NNNN≠≡NNNN≡≡NMN≠≡NNNN≡≡NNNN≠≡NNNN≡≡NPC≠≡NNNN≡≡NNNN≠≡NEWSPC≠≥
≠MOV≡≡SPCHDR≡≡R0≡≥ 014132 012700 000015 MOV #SPCHDR/2,R0 ;GET A BLOCK OF CORE
≠JSR≡≡PC≡≡GTFREE≡≥ 014136 004767 174706 JSR PC,GTFREE
≠MOV≡≡SZ≡≡RF≡≡SIZE≡≡R0≡≥ 014142 016560 000014 000004 MOV SZ(RF),SIZE(R0) ;REMEMBER HOW BIG
≠MOV≡≡NPB≡≡RF≡≡NPERB≡≡R0≡≥ 014150 016560 000010 000006 MOV NPB(RF),NPERB(R0) ;
≠MOV≡≡IDF≡≡RF≡≡IDFLAG≡≡R0≡≥ 014156 016560 000012 000000 MOV IDF(RF),IDFLAG(R0) ;
≠MOV≡≡NMN≡≡RF≡≡NMIN≡≡R0≡≥ 014164 016560 000004 000012 MOV NMN(RF),NMIN(R0);
≠MOV≡≡NPC≡≡RF≡≡NPCT≡≡R0≡≥ 014172 016560 000002 000014 MOV NPC(RF),NPCT(R0);
≡NEWS.1≠≠MOV≡≡SIDLST≡≡NXTSID≡≡R0≡≥ 014200 016760 175616 000016 NEWS.1: MOV SIDLST,NXTSID(R0) ;LINK ONTO ID CHAIN
≠MOV≡≡R0≡≡SIDLST≡≥ 014206 010067 175610 MOV R0,SIDLST
≠MOV≡≡IDFLAG≡≡R0≡≡R1≡≥ 014212 016001 000000 MOV IDFLAG(R0),R1 ;WILL IT FIT IN ID CHAIN
≠CMP≡≡R1≡≡MAXIDF≡≥ 014216 020127 000010 CMP R1,#MAXIDF ;WILL IT FIT INTO TABLE
≠BGT≡≡NEWS.2≡≥ 014222 003003 BGT NEWS.2 ;
≠ASL≡≡R1≡≥ 014224 006301 ASL R1 ;YES
≠MOV≡≡R0≡≡SIDTBL≡≡R1≡≥ 014226 010061 012024 MOV R0,SIDTBL(R1) ;PUT INTO TABLE
≡NEWS.2≠≠CLR≡≡FSTBUF≡≡R0≡≥ 014232 005060 000022 NEWS.2: CLR FSTBUF(R0) ;ZEROE OUT OTHER THINGS
≠CLR≡≡LSTBUF≡≡R0≡≥ 014236 005060 000024 CLR LSTBUF(R0) ;
≠CLR≡≡NALLOC≡≡R0≡≥ 014242 005060 000026 CLR NALLOC(R0)
≠CLR≡≡NFREE≡≡R0≡≥ 014246 005060 000030 CLR NFREE(R0)
≠RTS≡≡RF≡≥ 014252 000205 RTS RF ;RETURN
≥
≤ROUTIN≡≥ ROUTINE SETSPC,<SPCHDR>
≠.IFNB≡≡NNNN≠≠.IRP≡≡NNNN≡≡NNNN≠≠.IRP≡≡NNNN≡≡SPCHDR≠≡NNNN≡≡NNNN≠≡SETSPC≠≠MOV≡≡SPCHDR≡≡RF≡≡R0≡≥ 014254 016500 000002 MOV SPCHDR(RF),R0 ;
≠BR≡≡NEWS.1≡≥ 014260 000747 BR NEWS.1 ;GO INITIALIZE ALL NON-CONSTANT THINGS
≤ROUTIN≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 37
SMALLB PAL[HAL,HE] PAGE 13 SMALL BLOCK ALLOCATOR
≥ ROUTINE ADDBUF,<SPACE>
≠.IFNB≡≡NNNN≠≠.IRP≡≡NNNN≡≡NNNN≠≠.IRP≡≡NNNN≡≡SPACE≠≡NNNN≡≡NNNN≠≡ADDBUF≠≥ ;ADDS ANOTHER BUFFER TO THE NAMED SPACE
≠MOV≡≡R2≡≡SP≡≥ 014262 010246 MOV R2,-(SP) ;SAVE A REGISTER
≠MOV≡≡R3≡≡SP≡≥ 014264 010346 MOV R3,-(SP)
≠MOV≡≡SPACE≡≡RF≡≡R2≡≥ 014266 016502 000002 MOV SPACE(RF),R2
≠MOV≡≡SIZE≡≡R2≡≡R1≡≥ 014272 016201 000004 MOV SIZE(R2),R1 ;CALCULATE WORD REQUIREMENTS
≠INC≡≡R1≡≥ 014276 005201 INC R1 ;ONE WORD OVERHEAD FOR TAG & ID BYTES
≠MOV≡≡R1≡≡SP≡≥ 014300 010146 MOV R1,-(SP) ;WILL NEED THIS LATER
≠MUL≡≡NPERB≡≡R2≡≡R1≡≥ 014302 070162 000006 MUL NPERB(R2),R1 ;SIZE*NUMBER OF BLOCKS
≠ADD≡≡BUFHDR≡≡R1≡≥ 014306 062701 000004 ADD #BUFHDR/2,R1 ;
≠MOV≡≡R1≡≡R0≡≥ 014312 010100 MOV R1,R0 ;
≠JSR≡≡PC≡≡GTFREE≡≥ 014314 004767 174530 JSR PC,GTFREE ;GET A BLOCK
≠MOV≡≡LSTBUF≡≡R2≡≡R1≡≥ 014320 016201 000024 MOV LSTBUF(R2),R1 ;LINK ONTO CHAIN
≠MOV≡≡R1≡≡PRVBUF≡≡R0≡≥ 014324 010160 000002 MOV R1,PRVBUF(R0) ;LINK BACK
≠BEQ≡≡ADB.01≡≥ 014330 001403 BEQ ADB.01 ;
≠MOV≡≡R0≡≡NXTBUF≡≡R1≡≥ 014332 010061 000000 MOV R0,NXTBUF(R1) ;AND PERHAPS FORWARD
≠BR≡≡ADB.1≡≥ 014336 000402 BR ADB.1 ;
≡ADB.01≠≠MOV≡≡R0≡≡FSTBUF≡≡R2≡≥ 014340 010062 000022 ADB.01: MOV R0,FSTBUF(R2) ;IF WAS NO LSTBUF, THEN THIS IS FSTBUF
≡ADB.1≠≠CLR≡≡NXTBUF≡≡R0≡≥ 014344 005060 000000 ADB.1: CLR NXTBUF(R0) ;CLEAN UP
≠MOV≡≡R0≡≡LSTBUF≡≡R2≡≥ 014350 010062 000024 MOV R0,LSTBUF(R2) ;NEW NEWEST BLOCK
≠MOV≡≡R0≡≡R3≡≥ 014354 010003 MOV R0,R3 ;
≠ADD≡≡BUFHDR≡≡R3≡≥ 014356 062703 000012 ADD #2+BUFHDR,R3 ;POINTER AT FIRST BLOCK
≠MOV≡≡R3≡≡FSTBLK≡≡R0≡≥ 014362 010360 000006 MOV R3,FSTBLK(R0) ;REMEMBER IT
≠MOV≡≡NPERB≡≡R2≡≡R1≡≥ 014366 016201 000006 MOV NPERB(R2),R1 ;
≠ASL≡≡SP≡≥ 014372 006316 ASL (SP) ;NUMBER OF BYTES TO STEP BY
≠SUB≡≡SP≡≡R3≡≥ 014374 161603 SUB (SP),R3 ;TO UNDO FIRST ADD
≥
≡ADB.2≠≠ADD≡≡SP≡≡R3≡≥ 014376 061603 ADB.2: ADD (SP),R3
≠INC≡≡NFREE≡≡R2≡≥ 014400 005262 000030 INC NFREE(R2) ;ONE MORE FREE
≠CLRB≡≡TAG≡≡R3≡≥ 014404 105063 177777 CLRB TAG(R3) ;CLEAR TAG
≠MOVB≡≡IDFLAG≡≡R2≡≡TAGID≡≡R3≡≥ 014410 116263 000000 177776 MOVB IDFLAG(R2),TAGID(R3) ;SET TYPE ID
≠MOV≡≡FFREE≡≡R2≡≡WORD0≡≡R3≡≥ 014416 016263 000020 000000 MOV FFREE(R2),WORD0(R3) ;CONS ONTO FREE LIST
≠MOV≡≡R3≡≡FFREE≡≡R2≡≥ 014424 010362 000020 MOV R3,FFREE(R2) ;
≠DEC≡≡R1≡≥ 014430 005301 DEC R1 ;ITERATE
≠BGT≡≡ADB.2≡≥ 014432 003361 BGT ADB.2 ;IF ANY LEFT
≥
≠MOV≡≡R3≡≡LSTBLK≡≡R0≡≥ 014434 010360 000004 MOV R3,LSTBLK(R0) ;R3 NOW POINTS AT LAST BLOCK
≠TST≡≡SP≡≥ 014440 005726 TST (SP)+ ;POP
≠MOV≡≡SP≡≡R3≡≥ 014442 012603 MOV (SP)+,R3 ;RESTORE ACS
≠MOV≡≡SP≡≡R2≡≥ 014444 012602 MOV (SP)+,R2
≠RTS≡≡RF≡≥ 014446 000205 RTS RF
≥
≤ROUTIN≡ HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 38
SMALLB PAL[HAL,HE] PAGE 14 SMALL BLOCK ALLOCATOR
≥ ROUTINE FSINI
≠.IFNB≡≡FSINI≠≠CLR≡≡SIDLST≡≥ 014450 005067 175346 CLR SIDLST
≠CLR≡≡GCOK≡≥ 014454 005067 175336 CLR GCOK
≠CLR≡≡CPFYOK≡≥ 014460 005067 175334 CLR CPFYOK
≠CLR≡≡MMETHS≡≥ 014464 005067 175324 CLR MMETHS
≤CALL≡≥ CALL SETSPC,<#VCTSPC>
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠.IRP≡≠MOV≡≡VCTSPC≡≡SP≡≡NNNN≡≡NNNN≠≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡SETSPC≡≠RTS≡≡RF≡≥ 014510 000205 RTS RF
≥
≠.IFNZ≡≡SMBDBG≡≥ 000001 .IFNZ SMBDBG
≡FSTEST≠≤CALL≡≥ FSTEST: CALL FSINI
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡FSINI≡≠MOV≡≡R2≡≥ 014526 012702 000020 MOV #20,R2
≠MOV≡≡VCTARA≡≡R3≡≥ 014532 012703 015020 MOV #VCTARA,R3
≡FST.1≠≠MOV≡≡VCTID≡≡R0≡≥ 014536 012700 000001 FST.1: MOV #VCTID,R0
≠JSR≡≡PC≡≡GETBLK≡≥ 014542 004767 176606 JSR PC,GETBLK
≡FST.2≠≠MOV≡≡R0≡≡R3≡≥ 014546 010023 FST.2: MOV R0,(R3)+
≠DEC≡≡R2≡≥ 014550 005302 DEC R2
≠BGT≡≡FST.1≡≥ 014552 003371 BGT FST.1
≡FST.3≠≠MOV≡≡R2≡≥ 014554 012702 000013 FST.3: MOV #13,R2
≡FST.4≠≠MOV≡≡R3≡≡R0≡≥ 014560 014300 FST.4: MOV -(R3),R0
≠JSR≡≡PC≡≡FREBLK≡≥ 014562 004767 177016 JSR PC,FREBLK
≠DEC≡≡R2≡≥ 014566 005302 DEC R2
≠BGT≡≡FST.4≡≥ 014570 003373 BGT FST.4
≡FST.5≠≠MOV≡≡R2≡≥ 014572 012702 000017 FST.5: MOV #17,R2
≡FST.6≠≠MOV≡≡VCTID≡≡R0≡≥ 014576 012700 000001 FST.6: MOV #VCTID,R0
≠JSR≡≡PC≡≡GETBLK≡≥ 014602 004767 176546 JSR PC,GETBLK
≠MOV≡≡R0≡≡R3≡≥ 014606 010023 MOV R0,(R3)+
≠DEC≡≡R2≡≥ 014610 005302 DEC R2
≠BGT≡≡FST.6≡≥ 014612 003371 BGT FST.6
≡FST.10≠≠MOV≡≡TSTMTH≡≡R0≡≥ 014614 012700 015424 FST.10: MOV #TSTMTH,R0
≠JSR≡≡PC≡≡LNKMTH≡≥ 014620 004767 175302 JSR PC,LNKMTH
≠MOV≡≡R3≡≡VCTUB≡≥ 014624 010367 000570 MOV R3,VCTUB
≠SUB≡≡VCTUB≡≥ 014630 162767 000002 000562 SUB #2,VCTUB
≠MOV≡≡VCTARA≡≡VCTLB≡≥ 014636 012767 015020 000556 MOV #VCTARA,VCTLB
≠MOV≡≡GCOK≡≥ 014644 012767 177777 175144 MOV #-1,GCOK
≤CALL≡≥ CALL GC
≠MOV≡≡RF≡≡SP≡≡NNNN≠≠.IFNB≡≠MOV≡≡NNNN≡≡SP≡≠MOV≡≡SP≡≡RF≡≠JSR≡≡PC≡≡GC≡≡FST.11≠≠MOV≡≡R2≡≥ 014666 012702 000010 FST.11: MOV #10,R2
≡FST.12≠≠MOV≡≡VCTSPC≡≡R0≡≥ 014672 012700 011762 FST.12: MOV #VCTSPC,R0
≠JSR≡≡PC≡≡GETSBK≡≥ 014676 004767 176314 JSR PC,GETSBK
≠DEC≡≡R2≡≥ 014702 005302 DEC R2
≠BGT≡≡FST.12≡≥ 014704 003372 BGT FST.12
≥
≤HALERR≡≥ HALERR DNMSG
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡DNMSG≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≥
≡DNMSG≠≤ASCIE≡≥ DNMSG: ASCIE /
≠.ASCIZ≡≥ 014774 127
≥ 014775 105
≥ 014776 114
≥ 014777 114
≥ 015000 040
HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 39
SMALLB PAL[HAL,HE] PAGE 14.1 SMALL BLOCK ALLOCATOR
≥ 015001 110
≥ 015002 117
≥ 015003 127
≥ 015004 040
≥ 015005 104
≥ 015006 111
≥ 015007 104
≥ 015010 040
≥ 015011 127
≥ 015012 105
≥ 015013 040
≥ 015014 104
≥ 015015 117
≥ 015016 077
≥ 015017 000
≥ WELL HOW DID WE DO?/
≥
≡VCTARA≠≠.BLKW≡≥ 015420 VCTARA: .BLKW 200
≡VCTUB≠≥ 015420 000000 VCTUB: 0
≡VCTLB≠≥ 015422 000000 VCTLB: 0
≥
≡TSTMTH≠≤MMETH≡≥ TSTMTH: MMETH TSTRTN
≡TSTRTN≡≡TSTRTN≡≥
≤ROUTIN≡≥ ROUTINE TSTRTN,<RTN>
≠.IFNB≡≡NNNN≠≠.IRP≡≡NNNN≡≡NNNN≠≠.IRP≡≡NNNN≡≡RTN≠≡NNNN≡≡NNNN≠≡TSTRTN≠≠MOV≡≡R2≡≡SP≡≥ 015430 010246 MOV R2,-(SP)
≠MOV≡≡VCTLB≡≡R2≡≥ 015432 016702 177764 MOV VCTLB,R2
≡TST.R1≠≠CMP≡≡R2≡≡VCTUB≡≥ 015436 020267 177756 TST.R1: CMP R2,VCTUB
≠BGT≡≡TSTRTS≡≥ 015442 003005 BGT TSTRTS
≠MOV≡≡R2≡≡R0≡≥ 015444 011200 MOV (R2),R0
≠JSR≡≡PC≡≡MARKR0≡≥ 015446 004767 174442 JSR PC,MARKR0
≠MOV≡≡R0≡≡R2≡≥ 015452 010022 MOV R0,(R2)+
≠BR≡≡TST.R1≡≥ 015454 000770 BR TST.R1
≡TSTRTS≠≠MOV≡≡SP≡≡R2≡≥ 015456 012602 TSTRTS: MOV (SP)+,R2
≠RTS≡≡RF≡≥ 015460 000205 RTS RF
≥
≥ .ENDC
≥
HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 40
HAL PAL[HAL,HE] PAGE 2.2 SMALL BLOCK ALLOCATOR
≥
≥ ; program initialization
≥
≠.EVEN≡≥ 015462 .EVEN
≡START≠≠RESET≡≠RESET≡≥ 015462 000005 START: RESET
≠MOV≡≡SP≡≥ 015464 012706 000500 MOV #500,SP ;initialize stack
≠CLR≡≡PS≡≥ 015470 005067 162302 CLR PS ;initialize processor status
≡CLKIN≠≠CLR≡≡CLKCNT≡≥ 015474 005067 155044 CLKIN: CLR CLKCNT ;clear clock registers- trap restart
≠CLR≡≡CLKSET≡≥ 015500 005067 155036 CLR CLKSET
≠CLR≡≡CLKS≡≥ 015504 005067 155030 CLR CLKS
≤HALERR≡≥ HALERR RUGMES ;Finished here. Terminate cleanly.
≠MOV≡≡R0≡≡SP≡≠MOV≡≡R1≡≡SP≡≠MOV≡≡CRLFX≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡RUGMES≡≡R0≡≠JSR≡≡PC≡≡TYPSTR≡≠MOV≡≡SP≡≡R1≡≠MOV≡≡SP≡≡R0≡≠JMP≡≡RUG≡≠BR≡≥
≡PATCH≠≠.BLKW≡≥ 015756 PATCH: .BLKW 100
≥
≠.END≡≡START≡≥ 015462 .END START
HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 41
HAL PAL[HAL,HE] PAGE 2 ***SYMBOL TABLE***
AC0 000000R FREL 004000 GTFREE 011050 NEWSPC 014132
AC1 000001R FRERMS 013726 HCOR 077776 NFREE 000030H
AC2 000002R FRESBK 014016 IBUF 000150 NMIN 000012H
AC3 000003R FRINER 010730 IDF 000012H NMN 000004H
AC4 000004R FRINIT 010674 IDFLAG 000000H NNNN 000000H
AC5 000005R FRINMS 010776 II 000004H NPB 000010H
ADB.01 014340 FRMS1 011322 ILGINS 000010 NPC 000002H
ADB.1 014344 FRMS2 011376 INVMRK 000004H NPCT 000014H
ADB.2 014376 FROVFL 011254 KBIR 177562 NPERB 000006H
ADDBUF 014262 FRPOS 011114 KBIS 177560 NXF.0 012420
BUFHDR 000010H FRRET 011166 KBOR 177566 NXF.1 012424
CHGCOD 000002H FRTRY 011066 KBOS 177564 NXF.3 012464
CLKCNT 172544 FSINI 014450 LINKB 000004H NXF.4 012466
CLKIN 015474 FST.1 014536 LINKF 000002H NXF.NX 012432
CLKS 172540 FST.10 014614 LNKMTH 012126 NXR.0 012472
CLKSET 172542 FST.11 014666 LSTBLK 000004H NXR.1 012476
CLKTRP 000104 FST.12 014672 LSTBUF 000024H NXR.3 012536
CPFY 012544 FST.2 014546 MAPLP 012056 NXR.4 012540
CPFY.1 012330 FST.3 014554 MAPPTR 012046 NXR.NX 012504
CPFY.2 012410 FST.4 014560 MAPRTN 000002H NXTBUF 000000H
CPFYLP 012554 FST.5 014572 MAPRTS 012104 NXTCHG 000000H
CPFYNX 012600 FST.6 014576 MARK0 006400 NXTCLC 000000H
CPFYOK 012020 FSTBLK 000006H MARK1 006401 NXTGN 000000H
CPFYRT 012626 FSTBUF 000022H MARK2 006402 NXTMTH 000002H
CPFYSP 012272 FSTEST 014512 MARK3 006403 NXTSID 000016H
CPFYXX 012606 GC 013142 MARK4 006404 OBUF 000160
CPYR 012352 GCF 000006H MARK5 006405 PATCH 015556
CRLFX 000626 GCFG 000010H MARKPH 012142 PC 000007R
DATUM 000000H GCOK 012016 MARKR0 012114 PLACES 000000
DNMSG 014754 GERMSG 013434 MAXIDF 000010H PRVBUF 000002H
ERRTRP 000004 GETADB 013250 MERGR 011476 PRVGN 000002H
FEXACT 011174 GETB.C 013342 METH 000000H PS 177776
FFOUND 011126 GETBER 013362 MKP.02 012176 PTRSID 013566
FFREE 000020H GETBL1 013220 MKPH.1 012154 R0 000000R
FORM 000004H GETBLK 013354 MKPH.2 012202 R1 000001R
FR1 011116 GETBLX 013310 MKPH.3 012220 R2 000002R
FR2 011100 GETBXX 013304 MKPH.A 012226 R3 000003R
FRBER2 014076 GETGC 013270 MKPHRT 012254 R4 000004R
FREB. 013622 GETS.1 013542 MKROUT 012262 RADIX 000544
FREB.1 013612 GETS.2 013550 MKRTJM 012110 RF 000005R
FREB.2 013652 GETS.X 013540 MMETHS 012014 RL1 011516
FREBER 013660 GETSBK 013216 MUNLNK 012632 RLFER1 011526
FREBLK 013604 GETSID 013522 MUNRTS 012646 RLFER2 011574
FREEND 010670 GNCHGS 000014H NALLOC 000026H RLFREE 011426
FREEPT 000666 GNCLCS 000012H NEEDED 000002H RLMS1 011642
FREERR 011206 GNDEPS 000010H NEWS.1 014200 RLMS2 011712
FREEST 000672 GNVAL 000006H NEWS.2 014232 RLRET 011520
HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 42
HAL PAL[HAL,HE] PAGE 2 ***SYMBOL TABLE***
ROUT 000002H TYPSTR 000500
RTN 000002H VCTARA 015020
RUG 050000 VCTID 000001H
RUGMES 000631 VCTLB 015422
SETSPC 014254 VCTSPC 011762
SIDCNT 000000H VCTUB 015420
SIDLST 012022 WORD0 000000H
SIDTBL 012024
SIZE 000004H
SMBDBG 000001H
SP 000006R
SPACE 000002H
SPC 000002H
SPCC 000002H
SPCHDR 000002H
START 015462
STRT11 000500
SWEEP 012650
SWEEP1 012676
SWP. 012714
SWP.00 012724
SWP.01 012762
SWP.1 012766
SWP.1N 013002
SWP.2 013020
SWP.3 013036
SWP.4 013046
SWP.5 013066
SWP.6 013134
SWP.LP 012660
SWP.X 012672
SWP.XX 012710
SWPPIT 013200
SZ 000014H
TAG 177777H
TAGID 177776H
TSLOOP 000504
TST.R1 015436
TSTMTH 015424
TSTRTN 015430
TSTRTS 015456
TYPCHR 000566
TYPDEC 000516
TYPDIG 000536
TYPOCT 000526
TYPOUT 000560
TYPRET 000624
HAL Runtime System PALX 222 09/13/74 16:31:02 PAGE 43
HAL PAL[HAL,HE] PAGE 2 ***SYMBOL TABLE***
1.5 WDS AVG INSN LENGTH
19 SECONDS RUN-TIME